是否有可能將varchar列作爲主鍵,其值爲'a'和'a',總是給出此錯誤「違反PRIMARY KEY約束」在MS SQL Server 2008中。 在Oracle不會給出任何錯誤。 順便說一句我沒有實現這種方式我只是試圖將數據從oracle遷移到sql server。在SQL Server 2008中以尾隨空格作爲主鍵的Varchar
Regards
是否有可能將varchar列作爲主鍵,其值爲'a'和'a',總是給出此錯誤「違反PRIMARY KEY約束」在MS SQL Server 2008中。 在Oracle不會給出任何錯誤。 順便說一句我沒有實現這種方式我只是試圖將數據從oracle遷移到sql server。在SQL Server 2008中以尾隨空格作爲主鍵的Varchar
Regards
您可以使用一個text
或ntext
列,哪一列取決於您要導入的數據類型及其長度 - 這將保留空格。 char
會填充空格,所以可能不適合。
您可以嘗試將其存儲爲varbinary,然後在選擇時轉換爲varchar。
我認爲這可能與ANSI_PADDING有關:但是我的測試表明對於PKs(可能還有UNIQUE INDEXES,沒有嘗試過),這仍然沒有幫助。
所以:
SET ANSI_PADDING ON
適用於非PK場 - 也就是說,它保留在插入尾隨的空間,但由於某種原因沒有上的PK ...
參見:
謝謝我已經看到,我不知道的是,如果有一個選項形式改變方式(與尾隨墊或不)是SQL服務器比較唯一鍵... – cacaupt 2009-12-30 12:47:48
SQL-92標準規定,對於字符串比較目的,在比較之前將字符串填充爲相同的長度:ty這個pad字符是一個空格。
因此'a'和'a'比較EQUAL,這違反了PK約束。 http://support.microsoft.com/kb/316626
我找不到任何可以指示此行爲自此發生改變的東西。
您可能會使用varbinary代替varchar,但這可能無法做到您想要的。
您可以將另一列添加到主鍵約束中,該主約束保存oracle列中數據的長度。這將允許您導入數據並在需要時重建oracle數據 - 使用oracle數據的長度以及microsoft表中的長度來添加缺失空間以在報告中顯示等。
text和ntext不推薦使用,如果不提供它們,char將填充空白。 – RickNZ 2009-12-30 11:53:30
我轉換爲字符但sql服務器給出相同的錯誤。 – cacaupt 2009-12-30 12:00:53
'text'和'ntext'可能會被棄用,但是一次導入臨時表我沒有看到問題。 – Oded 2009-12-30 12:02:13