처리기에서 문자열을 varchar에 매핑하는 처리기

dapper

문제

나는 dapper에서 다음 코드를 발견했다 :

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter
{
    ...

    public void AddParameter(IDbCommand command, string name)
    {
        ...
        var param = command.CreateParameter();
        param.ParameterName = name;
        param.Value = (object)Value ?? DBNull.Value;
        if (Length == -1 && Value != null && Value.Length <= 4000)
        {
            param.Size = 4000;
        }
        else
        {
            param.Size = Length;
        }
        ...
    }
}

왜 여기서 코드가 길이를 4000으로 비교해야하는지 말해 줄 수 있습니까?

고맙습니다.

수락 된 답변

쿼리 계획 캐시.

다음 쿼리는 독립적이며 독립적입니다.

select @foo

select @foo

혼란 스러우면, 내가 보여 주지 않은 비트가 매개 변수 선언 이었기 때문입니다. 첫 번째 매개 변수 선언은 nvarchar(12) 이고 두 번째 매개 변수 선언은 nvarchar(20) 입니다. 코드에서 하려고하는 것은 단일 쿼리인데 두 번 실행됩니다. 예를 들어 hello (5 자)와 한 번, 한 번만 실행하면됩니다 world! (6 자) 두 개의 별도 질의 계획이 있음; 이는 계획을 공유하는 것보다 훨씬 효율적이지 않으며,이 선택이 사안에 부정적인 영향을 미칠 수있는 경우가 거의 없기 때문입니다.

길이를 임의의 값으로 표준화함으로써 대부분의 공통 값에서 동일한 쿼리 계획 캐시를 사용할 수 있습니다. 4000 은 상당히 자의적입니다 (실제로는 nvarchar(4000)max 영토에 들어가기 전에 최대 크기이기 때문에 실제로 선택되었습니다). 그리고 그것은 200 일 수도 있고 원하는대로 할 수도 있습니다. 이 코드는 대부분의 시간 값이 매우 짧기 때문에 더 큰 값 있으면 규칙이 아니라 예외가됩니다.

이 모든 것은 Length 명시 적으로 설정하지 않은 경우에만 발생합니다. 이 기능을보다 잘 제어하려면 .Length 를 원하는대로 설정 .Length 됩니다 . 주요 속성은 다음과 같습니다.

  • IsAnsi - [n][var]char(len)n 은 유니 코드 /
  • IsFixedLength - 고정 길이 / 가변 길이 사이에서 전환 - var [n][var]char(len)
  • Length - len[n][var]char(len)
  • Value - 실제 내용


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow