J'ai créé un index unique composé sur ma table:SQL Server 2008: classement ignoré dans l'index unique?
CREATE TABLE [dbo].[SearchIndexWord](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CatalogID] [int] NOT NULL,
[Word] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_SearchIndexWord] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [IX_SearchIndexWord] ON [dbo].[SearchIndexWord]
(
[Word] ASC,
[CatalogID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
Le classement pour la base de données complète est définie sur SQL_Latin1_General_CP1_CI_AS. Quand je lance l'imprime T-SQL suivante, 'Ne correspond pas':
IF 'm3/h' = 'm³/h'
PRINT 'Equals'
ELSE
PRINT 'Does not equal'
Ensuite, si je tente l'instruction d'insertion suivante:
INSERT INTO [SearchIndexWord] (Word, CatalogID) VALUES ('m3/h', 1), ('m³/h', 1)
je reçois le message d'erreur suivant:
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.SearchIndexWord' with unique index 'IX_SearchIndexWord'.
Pourquoi est-ce? Je ne pouvais pas le trouver dans les documents, mais je suppose que la condition de deux clés en cours de duplication est examinée en utilisant le classement configuré.
J'ai vérifié le classement des tables, des colonnes et des index, et ils sont tous égaux au classement de la base de données.
Vous avez raison. J'ai corrigé le problème en attribuant à la colonne en question un classement différent (SQL_Latin1_General_BIN). En outre, cela a fonctionné comme ceci: 'IF N'm3/h '= N'm³/h'' – ErikHeemskerk
L'approche CAST() fonctionne parce qu'elle transforme les deux chaînes en Unicode. Un plus rapide/plus facile de le faire est comme ceci: IF N'm3/h « = N'm³/h » PRINT « Égale » AUTRE PRINT « ne correspond pas à » En plaçant le marqueur N devant de chaque chaîne, vous dites à SQL Server de traiter chaque chaîne comme unicode - et je reçois ensuite 'Equals'. De même, vous pouvez également utiliser la clause COLLATE comme indiqué ici: http://www.sqlmag.com/blog/practical-sql-server-45/tsql/Collation-SQL-Server-139576 –