Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008唯一列,区分大小写_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

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

SQL Server 2008唯一列,区分大小写,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,有没有一种方法可以使列既唯一又区分大小写 我想能够把 abcde 和 ABCDE 在唯一列中。可以使用唯一约束强制唯一性 唯一索引是否区分大小写由服务器或表的排序规则定义 您可以通过以下查询获取数据库的当前排序规则: SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation; 你应该得到这样的东西: SQLCollation ———————————— SQL_Latin1_General_CP1_CI_AS 这

有没有一种方法可以使列既唯一又区分大小写

我想能够把

abcde 和 ABCDE


在唯一列中。

可以使用唯一约束强制唯一性

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

您可以通过以下查询获取数据库的当前排序规则:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
你应该得到这样的东西:

SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS
这里,排序规则末尾的CI_AS表示:CI=不区分大小写,AS=区分重音

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

马克

更新:

我刚刚尝试了这个SQL Server 2008 Developer Edition x64-对我来说有效我的数据库通常使用Latin1_General_CI_作为排序规则,但我可以为每个表/每个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

并且没有违反唯一索引的错误。

我需要从区分大小写的数据库导入数据。当我试图将主键放在作为源主键的列上时,由于重复键,我无法这样做。我将varchar列的排序规则更改为区分大小写,右键单击表,选择Design,突出显示要更改的列,然后单击排序规则中的省略号,现在它工作正常。SQL Server 2008 R2 64位

如果有人需要在已经在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

感谢@Devraj Gadhavi一步一步的帮助,因为这正是我需要做的。我本来打算编写这些脚本,但后来使用ssms2008r2,我以一种更懒惰的方式实现了同样的效果。在树状视图中,我找到了我的表和列,然后右键单击要更改排序规则的列,并选择“修改”。在显示的窗口中,我将属性中的排序规则更改为区分大小写的排序规则,然后在窗口顶部的开放空间中以表格形式列出列的任何位置,我右键单击并选择生成更改脚本…

我尝试了marc列出的脚本,在SQL Server 2008上运行良好,32位。似乎无法在UI中的每个表中执行此操作。但是,它可以在整个数据库的数据库创建过程中完成,这似乎有点太深远了。我很欣赏SQL脚本在每个表中执行此操作,很容易将其粘贴到中,并验证SELECT*FROM TestUnique WHERE[string]='ABC'与我一样只返回一行expect@Mitch:也许他正面临着第十种情况:-你永远不知道……简单地说,我想要更多的选择。我希望表会变得非常大,因此有62个字符的选项,而不是36个字符的选项。abc。。。ABC。。。123... 此外,该字段仅使用5个字符。这篇文章基本上是对另一篇文章@MitchWheat:Case 10:base-64编码哈希的补充values@mwolfe02:虽然这可能是一个有效的用例,但它不是海报5年前面临的用例。。。。