증상

다음 조건을 만족 하는 SQL Server 데이터베이스의 테이블을 사용할 수 있습니다.

  • 유니코드 열을 포함 하는 테이블입니다. 예를 들어, 테이블에는 nchar(5) 열.

  • 데이터 정렬은 유니코드 열은 "Latin1_General_BIN."

  • 동일한 유니코드 열에는 인덱스의 일부입니다.

그러나, T-SQL 문에서이 테이블에 대해 실행 되는 잘못 된 결과 반환할 수 있습니다. 이 문제는 다음 조건에 해당할 때 발생 합니다.

  • "IN"을 포함 하는 T-SQL 문 또는 같은 유니코드 열에 정의 된 "또는" 절.

  • T-SQL 문을 다른 이진 데이터 정렬은 유니코드 열 형식을 캐스팅 해야 "병합"를 포함 합니다.


쿼리 예제:

CREATE TABLE [dbo].[Table_1]( [Col1] [smallint] NOT NULL,
[Col2] [nchar](5) ,
[Col3] [nchar](5) COLLATE Latin1_General_BIN NOT NULL, -- Col3 , a Unicode Column with “Latin1_General_BIN” collation
CONSTRAINT [PK__Table_1] PRIMARY KEY CLUSTERED -- Primary Key on all the 3 columns
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


select * from Table_1 where Col1 = 1 and Col2 = '1' and Col3 collate Chinese_PRC_BIN IN (N'1' ,N'2') -- This statement using “IN” and “collate” might give incorrect results.
go


select * from Table_1 where Col1 = 1 and Col2 = '1' and (Col3 collate Chinese_PRC_BIN = N'1' or Col3 collate Chinese_PRC_BIN = N'2') -- This statement using “OR” and “collate” might give incorrect results.
go

상태

Microsoft는 "적용 대상" 절에 나열 된 제품의 문제 임을 확인 했습니다. 현재이 문제에 대 한 수정 작업. 이 문서는 추가 정보를 사용할 수 있을 때 업데이트 됩니다.

해결 방법

이 문제를 해결 하려면 있는지 확인 하는 유니코드 열 ("현상" 절에서 예제 쿼리의 Col3) 다음 조건 중 하나 이상을 충족 합니다.

  • 데이터 형식이 char(5) 또는 nvarchar(5)입니다.

  • 에 대해 "Chinese_PROC_BIN"의 동일한 데이터 정렬을 사용 하 여 정의 된 대조 하는 필요 (알고 있는 "Chinese_PROC_BIN"는 단지 예; 다른 이진 데이터 정렬에도 적용 될).

  • "Latin1_General_BIN." 이외의 다른 데이터 정렬의

  • CI 데이터 정렬에서 비교 됩니다. 예를 들어: Chinese_PRC_90_CI_AI IN ('1' N, N '2')를 한 부씩 인쇄 합니다.

  • 열 길이 일치 하는 상수와 비교 됩니다. 예를 들어, Chinese_PRC_BIN IN ('1' N, N '2')에 합쳐집니다.

  • 인덱스에 포함 되지 않은 또는 FORCESCAN 테이블 힌트를 사용 하 여 테이블 스캔이 강제 됩니다.

  • LTRIM 및 RTRIM 함수는 테이블 스캔을 강제 하는 데 사용 됩니다.

자세한 내용

이 문제를 재현 하려면 다음 스크립트를 실행 합니다.
CREATE DATABASE Test_DB GO

use Test_DB
go


CREATE TABLE [dbo].[Table_1](
[Col1] [smallint] NOT NULL,
[Col2] [nchar](5) ,
[Col3] [nchar](5) COLLATE Latin1_General_BIN NOT NULL, -- Col3 , a Unicode Column with “Latin1_General_BIN” collation

CONSTRAINT [PK__Table_1] PRIMARY KEY CLUSTERED -- Primary Key on all the 3 columns
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


-- Populate the table with a sample script as below

declare @x as int
declare @y as int

set @x=1
set @y=1

while (@x<=2)
begin
while (@y<=1000)
begin
insert into Table_1 values (@x,@y,@y)
set @y=@y+1
end
set @x=@x +1
end
go



select * from Table_1 where Col1 = 1 and Col2 = '1' and Col3 collate Chinese_PRC_BIN = N'1' -- Expected output of one row.
go


select * from Table_1 where Col1 = 1 and Col2 = '1' and Col3 collate Chinese_PRC_BIN in (N'1' ,N'2') -- No rows returned when output for Col3= N'1' is expected.
go


select * from Table_1 where Col1 = 1 and Col2 = '1' and (Col3 collate Chinese_PRC_BIN = N'1' or Col3 collate Chinese_PRC_BIN = N'2') -- No rows returned when output for Col3= N'1' is expected.
go

추가 도움이 필요하신가요?

기술 향상

교육 살펴보기 >

새로운 기능 우선 가져오기

Microsoft Insider 참가 >

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?

의견 주셔서 감사합니다!

×