区分大小写的SQL Server 2008唯一列

Cha*_*ell 25 sql t-sql sql-server sql-server-2008

有没有办法让列既独特又区分大小写?

我希望能够投入

abcdeABCDE

在一个独特的列中.

mar*_*c_s 35

可以使用唯一约束来强制执行唯一性.

唯一索引是否区分大小写由服务器(或表的)排序规则定义.

您可以使用此查询获取数据库的当前排序规则:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Run Code Online (Sandbox Code Playgroud)

你应该得到类似的东西:

SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)

这里,整理结束时的"CI_AS"表示:CI = Case Insensitive,AS = Accent sensitive.

这可以改为你需要的任何东西.如果您的数据库和/或表确实具有区分大小写的排序规则,我希望您的索引的唯一性也区分大小写,例如,您的abcdefABCDEF应该都是可接受的唯一字符串.

更新:

我刚试过这个(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
Run Code Online (Sandbox Code Playgroud)

我回来了:

string
ABC
abc
Run Code Online (Sandbox Code Playgroud)

并且没有关于违反唯一索引的错误.


Dev*_*avi 5

如果有人需要unique key/indexvarchar/ 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
Run Code Online (Sandbox Code Playgroud)