是否可以将 varchar 列作为主键,其值类似于 'a' 和 'a',在 MS SQL Server 2008 中总是给出此错误“违反主键约束”。在 Oracle 中不会给出任何错误。顺便说一句,我没有以这种方式实现,我只是想将数据从 oracle 迁移到 sql server。
问候
是否可以将 varchar 列作为主键,其值类似于 'a' 和 'a',在 MS SQL Server 2008 中总是给出此错误“违反主键约束”。在 Oracle 中不会给出任何错误。顺便说一句,我没有以这种方式实现,我只是想将数据从 oracle 迁移到 sql server。
问候
SQL-92 标准规定,出于字符串比较的目的,字符串在比较之前被填充为相同的长度:通常填充字符是空格。
因此'a'和'a'比较等于,这违反了PK约束。 http://support.microsoft.com/kb/316626
从那时起,我找不到任何迹象表明这种行为发生了变化。
您可能会使用 varbinary 而不是 varchar ,但这也可能无法满足您的要求。
您可以使用text
orntext
列,这取决于您要导入的数据类型及其长度 - 这将保留空格。char
将填充空格,因此可能不适合。
使用不去除尾随空格的数据类型。
您可以尝试存储为 varbinary,然后在选择时转换为 varchar。
我认为这可能与 ANSI_PADDING 有关:但我在此处的测试表明,对于 PK(也可能是 UNIQUE INDEXES,未尝试),不幸的是,这仍然无济于事。
所以:
SET ANSI_PADDING ON
适用于非 PK 字段 - 也就是说,它保留了插入的尾随空间,但由于某种原因不在 PK...
看 :
您可以将另一列添加到您的主键约束中,它包含 oracle 列中数据的长度。这将允许您在需要时导入数据并重建 oracle 数据 - 视图使用 oracle 数据的长度以及 microsoft 表中的长度来添加缺少的空格以在报告等中显示。