BCP 导入排除标识或某些列

BCP import exclude identify or some column

我正在使用 BCP,因为我想从 table:

中导出一些列
bcp "SELECT csusUsageDate, csusType, csusTrack1, csusTrack2, csusTrack3, csusDateReaded, csusLoggedIn FROM [DbJamaica].[dbo].[CS_Usage]" queryout "C:\temp\CS_Usage.txt" /U.. /P.. -c -T

这里我排除了我的主键,现在我想导入这个 txt,我希望我的主键是自动生成的:

bcp DbJamaica.dbo.CS_Usage out "C:\temp\CS_Usage.txt" /U.. /P.. -c -T

我一直格式不对,为什么?我也使用了格式文件,但我有同样的错误。 这是我的问题:如何排除标识列或某些列?

据我所知,你不能。 Bcp 基本上是盲目地批量插入 table,如果列不匹配,就会出现错误。不过,您可以做的是创建一个分段 table,例如:

SELECT  TOP 0 csusUsageDate, csusType, csusTrack1, csusTrack2, csusTrack3, csusDateReaded, csusLoggedIn
INTO    [DbJamaica].[dbo].[CS_Usage_TEMP] 
FROM    [DbJamaica].[dbo].[CS_Usage]

然后你可以在你的staging上使用bcp table:

bcp DbJamaica.dbo.CS_Usage_TEMP out "C:\temp\CS_Usage.txt" /U.. /P.. -c -T

接下来您可以将暂存数据插入实际 table,其中您将 PK 列设置为 IDENTITY:

INSERT INTO DbJamaica.dbo.CS_Usage (csusUsageDate, csusType, csusTrack1, csusTrack2, csusTrack3, csusDateReaded, csusLoggedIn)
SELECT   csusUsageDate, csusType, csusTrack1, csusTrack2, csusTrack3, csusDateReaded, csusLoggedIn
FROM     DbJamaica.dbo.CS_Usage_TEMP

最后清理:

DROP TABLE DbJamaica.dbo.CS_Usage_TEMP

您的源文件应该与目标 table 结构相匹配。这意味着,table 中的列数应与 csv/txt(源文件)中的列数匹配。

在您的情况下,即使您的 PK 列是标识列,您也必须在源文件中包含该列。 SQL 服务器会负责将列标识为身份,并且会忽略您放置在那里的值。所以你可以有任何价值,也可以没有,你的 bcp 会起作用。

如果您想保留标识值,则用例不同。请参阅文档中的 -E 参数 (bcp utility)