복붙노트

[SQL] SQL WHERE 절 후행 공백 매칭 값

SQL

SQL WHERE 절 후행 공백 매칭 값

SQL 서버 2008에서 나는 열 ZoneReference의 VARCHAR (50)와 존라는 테이블의 기본 키와 null이 있습니다.

나는 다음과 같은 쿼리를 실행하는 경우 :

select '"' + ZoneReference + '"' as QuotedZoneReference
from Zone
where ZoneReference = 'WF11XU'

나는 다음과 같은 결과를 얻을 :

"WF11XU "

후행 공백을합니다.

이것이 어떻게 가능한지? 후행 공백이 정말 행에있는 경우 나 SQL Server Management Studio를가 이상하게 표시되는 다른 그것의 무언가를 있으리라 믿고있어, 그래서 그때 제로 결과를 반환하는 기대.

zoneReference.Trim를 ()을 제안, 그것을 제거 호출하는 C # 코드에서 공백 문자의 일종이다.

누구든지 도움이 수 있습니까?

해결법

  1. ==============================

    1.즉, 예상 된 결과입니다 : 비교를 할 때 SQL Server의 = 연산자의 무시가 후행 공백.

    즉, 예상 된 결과입니다 : 비교를 할 때 SQL Server의 = 연산자의 무시가 후행 공백.

    출처

  2. ==============================

    2.후행 공간은 항상 무시되지 않습니다. 오늘이 문제를 경험했다. 내 표는 NCHAR 열을했고 VARCHAR 데이터에 결합되고 있었다. 테이블의 데이터가 필드로 넓은되지 않았기 때문에, 후행 공백이 자동으로 SQL Server가 추가되었다.

    후행 공간은 항상 무시되지 않습니다. 오늘이 문제를 경험했다. 내 표는 NCHAR 열을했고 VARCHAR 데이터에 결합되고 있었다. 테이블의 데이터가 필드로 넓은되지 않았기 때문에, 후행 공백이 자동으로 SQL Server가 추가되었다.

    나는 VARCHAR 매개 변수를 가지고 간 ITVF (인라인 테이블 반환 함수)를 가지고 있었다. A는 NCHAR 필드와 테이블에 가입하기에 매개 변수가 사용되었다.

    은 함수에 전달 된 데이터가 후행 공백이 없어서 실패했지만 테이블의 데이터가 한 조인. 왜이었다?

    나는 DATA TYPE보다 우선 순위에 있습니다 위로 넘어지고 있었다. (http://technet.microsoft.com/en-us/library/ms190309.aspx 참조)

    다른 타입의 문자열을 비교할 때, 낮은 우선 순위 타입은 비교하기 전에 높은 우선 형식으로 변환된다. 그래서 내 VARCHAR 매개 변수 NCHARs로 변환되었다. NCHARs 비교 하였다, 그리고 분명히 공간은 유의 하였다.

    어떻게이 해결 되었습니까? I는 NCHAR보다 높은 우선 순위로되어 NVARCHAR 매개 변수를 사용하는 함수의 정의를 변경. 이제 NCHARs는 NVARCHARs에 SQL Server가 자동으로 변경되었고 후행 공백은 무시되었다.

    왜 난 그냥 RTRIM을 수행하지 않은? 테스트는 RTRIM이 (가) SQL 서버 그렇지 않으면 사용했을 것이라고 최적화 가입 방지 성능을 죽인 것으로 나타났다.

    왜 테이블의 데이터 형식을 변경하지? 테이블은 이미 고객 사이트에 설치되어, 그들은 (유료 DBA가 시간 + 돈) 유지 보수 스크립트를 실행하거나 우리에게 자신의 machinines (이해)에 대한 액세스 권한을 부여하지 않습니다.

  3. ==============================

    3.그래, 마크 맞습니다. 다음 SQL을 실행합니다 :

    그래, 마크 맞습니다. 다음 SQL을 실행합니다 :

    create table #temp (name varchar(15))
    insert into #temp values ('james ')
    select '"' + name + '"' from #temp where name ='james'
    select '"' + name + '"' from #temp where name like 'james'
    drop table #temp
    

    단, '같은'문에 대한 주장은 위의 예에서 작동하지 나타납니다. 산출:

    (1 row(s) affected)
    
    -----------------
    "james "
    
    (1 row(s) affected)
    
    
    -----------------
    "james "
    
    (1 row(s) affected)
    

    편집하다: 작업로를 얻으려면, 당신은 마지막에 넣어 수 있습니다 :

    and name <> rtrim(ltrim(name))
    

    미운하지만.

    EDIT2 : 코멘트가 abovem을 감안할 때, 다음 작동합니다 :

    select '"' + name + '"' from #temp where 'james' like name
    
  4. ==============================

    4.시험

    시험

        select Replace('"' + ZoneReference + '"'," ", "") as QuotedZoneReference from Zone where ZoneReference = 'WF11XU'
    
  5. from https://stackoverflow.com/questions/4166159/sql-where-clause-matching-values-with-trailing-spaces by cc-by-sa and MIT license