是否可以将varchar列作为主键,其值为'a'和'a',在MS SQL Server 2008中始终会出现此错误“违反PRIMARY KEY约束”。 在Oracle中不要给出任何错误。 顺便说一句我没有这样实现我只是试图将数据从oracle迁移到sql server。
此致
答案 0 :(得分:4)
SQL-92标准规定,为了进行字符串比较,在比较之前将字符串填充为相同的长度:通常填充字符是空格。
因此'a'和'a'比较EQUAL,这违反了PK约束。 http://support.microsoft.com/kb/316626
我找不到任何迹象表明此行为已经发生变化。
你可能会使用varbinary而不是varchar,但这可能无法做到你想要的。
答案 1 :(得分:1)
您可以使用text
或ntext
列,其中一列取决于您要导入的数据类型及其长度 - 这将保留空格。 char
将填充空格,因此可能不合适。
答案 2 :(得分:0)
使用不剥离尾随空格的数据类型。
答案 3 :(得分:0)
您可以尝试存储为varbinary,然后在选择时转换为varchar。
答案 4 :(得分:0)
我认为这可能与ANSI_PADDING有关:但我在这里的测试表明,对于PKs(可能还有UNIQUE INDEXES,未尝试过),这仍然无济于事。
所以:
SET ANSI_PADDING ON
适用于非PK字段 - 也就是说,它会保留插入的尾随空格,但由于某些原因不在PK上...
见:
答案 5 :(得分:0)
您可以在主键约束中添加另一列,该约束保存oracle列中数据的长度。这将允许您在需要时导入数据并重建oracle数据 - 使用oracle数据的长度以及microsoft表中的长度来添加缺少的空间以便在报告中显示等。