在SQL Server 2008中以尾随空格作为主键的Varchar
是否有可能将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