【发布时间】:2011-11-16 16:33:40
【问题描述】:
我正在 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 违规错误。
所以问题是,我的格式或输入文件有什么问题导致第一列被忽略?
谢谢。
【问题讨论】:
-
好吧,我通过使用格式描述符的 XML 版本解决了这个问题,如下所示:
<?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t"/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" COLLATION="Modern_Spanish_CI_AS"/> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="BOOK_ID" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/> <COLUMN SOURCE="2" NAME="BOOK_DESCRIPTION" xsi:type="SQLVARYCHAR"/> </ROW> </BCPFORMAT> -
无论如何,如果有人对非 xml 格式文件的问题有答案,我将不胜感激......谢谢。
标签: sql-server-2008 bcp