SQL Server 2008 Уникальный столбец с учетом регистра - PullRequest
24 голосов
/ 03 октября 2009

Есть ли способ сделать колонку уникальной и чувствительной к регистру?

Я хочу иметь возможность поставить

ABCDE а также ABCDE

в уникальном столбце.

Ответы [ 4 ]

33 голосов
/ 03 октября 2009

Уникальность может быть обеспечена с помощью уникального ограничения.

Является ли уникальный индекс чувствительным к регистру или нет, определяется сервером (или таблицей) параметры сортировки .

Вы можете получить текущую сортировку вашей базы данных с помощью этого запроса:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

и вы должны получить что-то вроде:

SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS

Здесь "CI_AS" в конце сопоставления означает: CI = без учета регистра, AS = с учетом акцента.

Это можно изменить на то, что вам нужно. Если в вашей базе данных и / или таблице есть сопоставление с учетом регистра, я ожидаю, что уникальность вашего индекса также будет зависеть от регистра, например, Ваши abcdef и ABCDEF должны быть приемлемы как уникальные строки.

Марк

UPDATE:

Я только что попробовал это (SQL Server 2008 Developer Edition x64) - работает для меня (моя база данных обычно использует сортировку "Latin1_General_CI_AS, но я могу определить другой для таблицы / даже для столбца VARCHAR):

CREATE TABLE TestUnique
    (string VARCHAR(50) COLLATE SQL_Latin1_General_Cp1_CS_AS)

CREATE UNIQUE INDEX UIX_Test ON dbo.TestUnique(string)

INSERT INTO dbo.TestUnique(string) VALUES ('abc')
INSERT INTO dbo.TestUnique(string) VALUES ('ABC')

SELECT * FROM dbo.TestUnique

и я вернусь:

string
ABC
abc

и нет ошибки о нарушении уникального индекса.

4 голосов
/ 06 августа 2014

Если кому-то нужно сделать это на существующей таблице, в которой уже есть столбец unique key/index, определенный в столбце varchar / nvarchar, вот сценарий.

ALTER TABLE [YourTable] DROP CONSTRAINT [UIX_YourUniqueIndex]
GO

ALTER TABLE [YourTable] ALTER COLUMN [YourColumn] [nvarchar](50) COLLATE Latin1_General_CS_AS NOT NULL;
GO

ALTER TABLE [YourTable] ADD  CONSTRAINT [UIX_YourUniqueIndex] UNIQUE NONCLUSTERED 
(
    [YourColumn] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
0 голосов
/ 20 июля 2015

Спасибо @Devraj Gadhavi за шаг за шагом, так как это именно то, что мне нужно было сделать. Я собирался сделать эти сценарии, но затем (используя SSMS 2008R2) я достиг того же самого более ленивым способом :-). В древовидном представлении я нашел таблицу и столбец, а затем щелкнул правой кнопкой мыши столбец, для которого нужно изменить параметры сортировки, и выбрал «Изменить». В отображаемом окне я изменил параметры сортировки в свойствах на чувствительный к регистру, а затем в любом месте открытого пространства в верхней части окна (где столбцы перечислены в виде таблицы), щелкнул правой кнопкой мыши и выбрал «Создать скрипт изменения ... "

0 голосов
/ 12 июня 2013

Мне нужно было импортировать данные из чувствительной к регистру базы данных. Когда я попытался поместить первичный ключ в столбец, который является первичным ключом в источнике, я не смог сделать это из-за дублирования ключей. Я изменил параметры сортировки для столбца (varchar) с учетом регистра (щелкните правой кнопкой мыши таблицу, выберите «Дизайн», выделите столбец, который вы хотите изменить, и нажмите на elipsis в Collation), и теперь он работает нормально. (SQL Server 2008 R2 64 бит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...