2

是否有可能將varchar列作爲主鍵,其值爲'a'和'a',總是給出此錯誤「違反PRIMARY KEY約束」在MS SQL Server 2008中。 在Oracle不會給出任何錯誤。 順便說一句我沒有實現這種方式我只是試圖將數據從oracle遷移到sql server。在SQL Server 2008中以尾隨空格作爲主鍵的Varchar

Regards

回答

1

您可以使用一個textntext列,哪一列取決於您要導入的數據類型及其長度 - 這將保留空格。 char會填充空格,所以可能不適合。

+1

text和ntext不推薦使用,如果不提供它們,char將填充空白。 – RickNZ 2009-12-30 11:53:30

+0

我轉換爲字符但sql服務器給出相同的錯誤。 – cacaupt 2009-12-30 12:00:53

+2

'text'和'ntext'可能會被棄用,但是一次導入臨時表我沒有看到問題。 – Oded 2009-12-30 12:02:13

0

使用不去掉尾隨空格的數據類型。

+0

比如說什麼?以及將內容視爲字符串而不是不透明二進制數據的任何此類數據類型? – binki 2017-01-18 03:25:03

0

您可以嘗試將其存儲爲varbinary,然後在選擇時轉換爲varchar。

0

我認爲這可能與ANSI_PADDING有關:但是我的測試表明對於PKs(可能還有UNIQUE INDEXES,沒有嘗試過),這仍然沒有幫助。

所以:

SET ANSI_PADDING ON 

適用於非PK場 - 也就是說,它保留在插入尾隨的空間,但由於某種原因沒有上的PK ...

參見:

http://support.microsoft.com/kb/154886/EN-US/

+0

謝謝我已經看到,我不知道的是,如果有一個選項形式改變方式(與尾隨墊或不)是SQL服務器比較唯一鍵... – cacaupt 2009-12-30 12:47:48

4

SQL-92標準規定,對於字符串比較目的,在比較之前將字符串填充爲相同的長度:ty這個pad字符是一個空格。

因此'a'和'a'比較EQUAL,這違反了PK約束。 http://support.microsoft.com/kb/316626

我找不到任何可以指示此行爲自此發生改變的東西。

您可能會使用varbinary代替varchar,但這可能無法做到您想要的。

0

您可以將另一列添加到主鍵約束中,該主約束保存oracle列中數據的長度。這將允許您導入數據並在需要時重建oracle數據 - 使用oracle數據的長度以及microsoft表中的長度來添加缺失空間以在報告中顯示等。