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表中的长度来添加缺失空间以在报告中显示等。