Query di SQL Server che esegue una colonna di Unicode a regole di confronto binarie restituisce risultati non corretti

Sintomi

Si dispone di una tabella in un database di SQL Server in cui vengono soddisfatte le condizioni seguenti:

  • La tabella contiene una colonna di Unicode. Ad esempio, la tabella include una colonna nchar(5) .

  • Regole di confronto della colonna Unicode è "Latin1_General_BIN".

  • La stessa colonna Unicode fa parte di un indice.

Tuttavia, le istruzioni T-SQL eseguite su questa tabella potrebbero restituire risultati non corretti. Questo problema si verifica quando sono vere le seguenti condizioni:

  • L'istruzione T-SQL contiene un "IN" o "O" clausola definita per la stessa colonna di Unicode.

  • L'istruzione T-SQL contiene "fascicolare" per il cast di tipo colonna Unicode da un altro confronto binario.


Query di esempio:

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

Stato

Microsoft ha confermato che si tratta di un problema nei prodotti Microsoft elencati nella sezione "Si applica a". Stiamo attualmente lavorando su una correzione per questo problema. In questo articolo verrà aggiornato quando diventano disponibili ulteriori informazioni.

Soluzione alternativa

Per risolvere questo problema, assicurarsi che la colonna di tipo Unicode (Col3 nella query di esempio nella sezione "Sintomi") soddisfa una delle seguenti condizioni:

  • È del tipo di dati char(5) o nvarchar(5).

  • Viene definito utilizzando le stesse regole di confronto di "Chinese_PROC_BIN" per cui collate desiderata (si noti che "Chinese_PROC_BIN" è solo un esempio, si applicano anche altre regole di confronto binarie).

  • È di un confronto diverso da "Latin1_General_BIN".

  • È fascicolato nel confronto degli elementi di configurazione. Ad esempio: fascicolazione IN Chinese_PRC_90_CI_AI ('1' N, N "2").

  • Viene confrontato con una costante che corrisponda alla lunghezza della colonna. Collate, ad esempio, IN Chinese_PRC_BIN ('1' N, N "2").

  • Non fa parte dell'indice o una scansione della tabella viene forzato utilizzando l'hint di tabella FORCESCAN.

  • Le LTRIM RTRIM vengono utilizzate per imporre una scansione della tabella.

Ulteriori informazioni

Per riprodurre il problema, eseguire lo script seguente:
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

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×