3

是否可以将 varchar 列作为主键,其值类似于 'a' 和 'a',在 MS SQL Server 2008 中总是给出此错误“违反主键约束”。在 Oracle 中不会给出任何错误。顺便说一句,我没有以这种方式实现,我只是想将数据从 oracle 迁移到 sql server。

问候

4

6 回答 6

4

SQL-92 标准规定,出于字符串比较的目的,字符串在比较之前被填充为相同的长度:通常填充字符是空格。

因此'a'和'a'比较等于,这违反了PK约束。 http://support.microsoft.com/kb/316626

从那时起,我找不到任何迹象表明这种行为发生了变化。

您可能会使用 varbinary 而不是 varchar ,但这也可能无法满足您的要求。

于 2010-06-10T10:29:03.460 回答
2

您可以使用textorntext列,这取决于您要导入的数据类型及其长度 - 这将保留空格。char将填充空格,因此可能不适合。

于 2009-12-30T11:49:22.620 回答
0

使用不去除尾随空格的数据类型。

于 2009-12-30T11:46:42.157 回答
0

您可以尝试存储为 varbinary,然后在选择时转换为 varchar。

于 2009-12-30T11:54:33.887 回答
0

我认为这可能与 ANSI_PADDING 有关:但我在此处的测试表明,对于 PK(也可能是 UNIQUE INDEXES,未尝试),不幸的是,这仍然无济于事。

所以:

SET ANSI_PADDING ON

适用于非 PK 字段 - 也就是说,它保留了插入的尾随空间,但由于某种原因不在 PK...

看 :

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

于 2009-12-30T12:09:37.710 回答
0

您可以将另一列添加到您的主键约束中,它包含 oracle 列中数据的长度。这将允许您在需要时导入数据并重建 oracle 数据 - 视图使用 oracle 数据的长度以及 microsoft 表中的长度来添加缺少的空格以在报告等中显示。

于 2016-10-04T01:42:24.540 回答