2012-05-04 97 views
0

因此,我試圖做一些非常簡單的事情;修改一個表並添加一個外鍵約束。問題是它給我一個錯誤,關於列的排序規則不匹配:排序規則問題MSSQL

列外號與在外鍵等級中引用列外差的排序規則不同。

我不明白這一點,我已經到處尋找。當我查看SQL屬性頁面時,它顯示相同的排序規則(Latin1_General_CI_AS)。我到處尋找,我不知道如何改變這一點。任何人誰可以幫助,將不勝感激。謝謝!

+0

請張貼的DDL兩個表 –

回答

5

當試圖比較在SQL Server中兩個字符串的排序規則必須匹配,否則,你得到這個錯誤。整理通知SQL Server如何比較字符串(即CHAR,NCHAR,VARCHAR,NVARCHAR)。排序規則Latin1_General_CI_AS使用Latin1_General字符集,不區分大小寫,區分重音。

一些東西,你需要知道之前我給你的解決方案:有三個級別的排序規則的SQL Server中:

  1. 服務器默認排序規則:這是在SQL Server安裝過程中設置,並定義用於在服務器上創建的新數據庫的默認排序規則。這也是用於系統數據庫(包括TempDB)的默認排序規則。換句話說,如果創建臨時表而不指定要使用的排序規則,它將使用服務器的默認值。您可以通過右鍵單擊服務器並選擇屬性來找到它。
  2. 數據庫默認排序規則。這是在數據庫中創建表時將使用的排序規則,而不會在創建表時明確指定排序規則。默認情況下,這與服務器的排序規則相同,但可以在創建數據庫時指定。如果備份數據庫並在另一個服務器上使用不同的歸類恢復它,它將保留自己的歸類,而不繼承服務器的歸類。您可以通過右鍵單擊數據庫並選擇屬性來查看。
  3. 字段整理。這是特定字段的排序規則,對於數據庫中的所有字符串類型字段都存在。如果更改數據庫的排序規則,它不會更改數據庫中所有字符串字段的排序規則;只有那些隨後在數據庫上創建的字段。您可以使用sp_help TableName在表設計器中看到此排序規則,或右鍵單擊該字段並選擇屬性。

爲了解決您的問題,您需要更改你要比較兩個領域之一的整理,使他們一樣。同時更改到數據庫的排序規則匹配可能會是你最好的做法:

ALTER TABLE MyMaster ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS 
ALTER TABLE MyDetail ALTER COLUMN MyMasterKey VARCHAR(30) COLLATE LATIN1_General_CI_AS 

然後你就可以定義外鍵:

ALTER TABLE MyDetail ADD CONSTRAINT FK_Master_Detail FOREIGN KEY (MyMasterKey) REFERENCES MyMaster(MyMasterKey) 
1

看起來好像兩個表或兩個字段(外鍵 - 主鍵)具有不同的排序規則。你能給我們更多的信息嗎?

  1. 你能確認數據庫的排序規則嗎?
  2. 您是否可以確認外鍵字段上的排序規則以及引用表上的主鍵?
  3. 您是否在任何地方使用臨時表?臨時表採用sql實例的排序規則。如果數據庫是使用不同的排序規則創建的,則可能會發生此問題。

參見如何檢查覈對這個帖子:SQL Authority Blogpost

+0

好我正在使用SQL Server 2008 R2,並且我只需在對象資源管理器中右鍵單擊它並查看擴展屬性,它將兩個排序規則顯示爲Latin1_General_CI_AS ... – Jack