簡體   English   中英

區分大小寫的SQL Server 2008唯一列

[英]SQL Server 2008 Unique Column that is Case Sensitive

有沒有辦法讓列既獨特又區分大小寫?

我希望能夠投入

abcdeABCDE

在一個獨特的列中。

可以使用唯一約束來強制執行唯一性。

唯一索引是否區分大小寫由服務器(或表的) 排序規則定義

您可以使用此查詢獲取數據庫的當前排序規則:

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

你應該得到類似的東西:

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

這里,整理結束時的“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

我回來了:

string
ABC
abc

並且沒有關於違反唯一索引的錯誤。

如果某個人需要在已經在varchar / nvarchar列上定義了unique key/index的現有表上執行此操作,則此處是腳本。

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

我需要從區分大小寫的數據庫導入數據。 當我嘗試將主鍵放在作為源上主鍵的列上時,由於重復鍵,我無法執行此操作。 我將列(varchar)的排序規則更改為區分大小寫(右鍵單擊表,選擇“設計”,突出顯示要更改的列,然后單擊“排序”中的省略號),現在它可以正常工作。 (SQL Server 2008 R2 64位)。

感謝@Devraj Gadhavi一步一步,因為這正是我需要做的。 我即將制作這些腳本但是(使用SSMS 2008R2),我以更加懶惰的方式實現了同樣的方式:-)。 在樹形視圖中,我找到了我的表和列,然后右鍵單擊了我想要更改排序規則的列並選擇了“修改”。 在顯示的窗口中,我將屬性中的排序規則更改為區分大小寫,然后在窗口頂部的開放空間中的任何位置(列表以表格形式列出)中我右鍵單擊並選擇“生成更改腳本” ......”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM