SQL Server 2008: сортировка игнорируется в уникальном индексе? - PullRequest
0 голосов
/ 18 августа 2010

Я создал составной уникальный индекс для своей таблицы:

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]

Для параметров сортировки для всей базы данных установлено значение SQL_Latin1_General_CP1_CI_AS. Когда я запускаю следующий T-SQL, он печатает «Не равно»:

IF 'm3/h' = 'm³/h'
    PRINT 'Equals'
ELSE
    PRINT 'Does not equal'

Тогда, если я попробую следующий оператор вставки:

INSERT INTO [SearchIndexWord] (Word, CatalogID) VALUES ('m3/h', 1), ('m³/h', 1)

Я получаю следующее сообщение об ошибке:

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.SearchIndexWord' with unique index 'IX_SearchIndexWord'.

Почему это? Я не смог найти его в документации, но я предполагаю, что условие дублирования двух ключей проверяется с использованием настроенного сопоставления.

Кстати, я проверил параметры сортировки таблиц, столбцов и индексов, и все они равны параметрам сортировки базы данных.

1 Ответ

1 голос
/ 18 августа 2010

Попробуйте это:

IF CAST('m3/h' AS NVARCHAR(100)) = CAST('m³/h' AS NVARCHAR(100))
    PRINT 'Equals' 
ELSE 
    PRINT 'Does not equal' 

Для меня это возвращает 'Equals', что объясняет, почему вы получаете ошибку строки дублирующегося ключа.

Я подозреваю, что значения в коде IF 'm3/h' = 'm³/h' созданы как VARCHAR.

...