我正在尝试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违规错误。
所以问题是,我的格式或输入文件有什么问题导致第一列被忽略?
感谢。
答案 0 :(得分:1)
我从未见过数据类型为DEC的主键列,不确定小数是否有效。我总是使用整数。 但我认为问题是PK列没有标识集,因此在添加新行时它不会自动递增。在您的表中创建代码,替换:
[BOOK_ID] [数字](18,0)NOT NULL, 同 [BOOK_ID] [int] IDENTITY(1,1)NOT NULL,
干杯