普通BCP插入的主键违规

时间:2011-11-16 16:33:41

标签: sql-server-2008 bcp

我正在尝试SQL Server 2008 Express上的BCP实用程序。我不认为我正在尝试做的事情可能更简单,但在尝试将两行插入空表时,我仍然遇到主键违规。

这是表DDL:

CREATE TABLE [dbo].[BOOKS](
    [BOOK_ID] [numeric](18, 0) NOT NULL,
    [BOOK_DESCRIPTION] [varchar](200) NULL,
CONSTRAINT [BOOKS PK] PRIMARY KEY CLUSTERED 
(
[BOOK_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

以下是BCP格式文件:

10.0
2
1       SQLNUMERIC          0       3     "\t"     1     BOOK_ID                              ""
2       SQLCHAR             0       0     "\r\n"   2     BOOK_DESCRIPTION                     Modern_Spanish_CI_AS

这是我的输入文件:

101 BOOK_ABC_001<CR><LF>
102 BOOK_ABC_002<CR><LF>

最后这是我运行的命令:

bcp Database.dbo.BOOKS in books.txt -T -f BOOKS-format.fmt

这是我得到的错误:

Starting copy...
SQLState = 23000, NativeError = 2627
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Violation of PRIMARY KEY  constraint 'BOOKS PK'. Cannot insert duplicate key in object 'dbo.BOOKS'.
SQLState = 01000, NativeError = 3621
Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been terminated.

BCP copy in failed

现在,如果我使用单行输入文件,BCP会成功。在这种情况下,BOOK_ID列被赋值为0.所以似乎我的输入文件中的第一个字段被忽略,并且0被用作所有行的BOOK_ID的值,这将解释PK违规错误。

所以问题是,我的格式或输入文件有什么问题导致第一列被忽略?

感谢。

1 个答案:

答案 0 :(得分:1)

我从未见过数据类型为DEC的主键列,不确定小数是否有效。我总是使用整数。 但我认为问题是PK列没有标识集,因此在添加新行时它不会自动递增。在您的表中创建代码,替换:

[BOOK_ID] [数字](18,0)NOT NULL, 同 [BOOK_ID] [int] IDENTITY(1,1)NOT NULL,

干杯