SQL BCP 无法为标识列插入值

SQL BCP Unable to insert value for identity column

我正在使用 bcp utility 导入制表符分隔文件。我的 table 有一个标识列,当我使用 运行 bcp 命令时,我得到错误 as

Error = [Microsoft][SQL Server Native Client 11.0] Invalid date format

第二列是日期时间。当我使用 -E 标志时(正如许多人所建议的那样),我得到错误

Error = [Microsoft][SQL Server Native Client 11.0] Invalid character value for cast specification

当我没有标识列时一切正常。我不确定这里缺少什么。

这是一个重现:

CREATE TABLE [dbo].[test_temptable]
(
    [ID] int NOT NULL IDENTITY PRIMARY KEY,
    [Date] [datetime] NULL,
    [Column2] [varchar](100) NULL,
    [Column3] [varchar](100) NULL,
) 
ON [PRIMARY]
GO

测试数据(testTempTable.txt - 制表符分隔):

15-Sep-18   TestColumn2 TestColumn3

BCP 命令。

bcp "testDB.dbo.test_temptable" in  "c:\temp\test\testTempTable.txt" -c -t"\t" -T -S  "testSQlServer" -E -e c:\temp\test\error.csv

当我从 table 和 运行 中删除 [ID] 列时,一切正常。

我做错了什么?

编辑: 当 table 没有标识列

时分配的值

有用的链接:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-identity-values-when-bulk-importing-data-sql-server?view=sql-server-2017

What will be BCP format for inserting a identity column

问题是您正在尝试将第一列(日期)添加到 INT 列中。

你有三个选择...

  1. 将 INT 列作为第一行添加到源数据中,并使其递增,就像 IDENTITY 递增一样,并继续传递 -E 选项。这样做将允许将源中的数据用作 IDENTITY 列。

  2. 将随机 INT 添加到源数据的第一列,假设每行 1,然后 不要 传入 -E。根据文档,当未提供 -E 时,它将忽略标识列的值并从当前种子值开始并自动递增。

  3. 利用格式文件指定数据文件中的哪些列进入我们 SQL table.

  4. 中的哪些列

How to specify the format file

How to construct a format file

祝你好运!

您可以在 XML 中创建文件格式并跳过标识列。但是标识栏一定是最后一个.

来自微软网站:
对于 XML 格式文件,当您使用 bcp 命令或 BULK INSERT 语句直接导入到 table 时不能跳过列。 但是,您可以导入 table 的最后一列以外的所有内容。如果您必须跳过最后一列以外的任何列,则必须创建一个目标视图 table,该视图仅包含数据文件中包含的列。