BCP导入排除标识或某些列

时间:2016-05-25 11:11:29

标签: sql-server bcp

我正在使用BCP,因为我想从表中导出一些列:

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

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

x = pd.DataFrame({'a':[1,5,5], 'b':[7,0,7]})

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

2 个答案:

答案 0 :(得分:1)

据我所知,你不能。 Bcp基本上是批量插入表中,如果列不匹配,则会出错。但是,您可以创建一个临时表,如:

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

然后您可以在临时表上使用bcp:

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

接下来,您可以将分段中的数据插入到实际表中,并将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

答案 1 :(得分:0)

您的源文件应与目标表结构匹配。也就是说,表中的列数应与csv / txt(源文件)中的列数匹配。

就您而言,即使PK列是标识列,您也必须在源文件中包含该列。 SQL Server将负责将列标识为标识,并且将忽略您在此处输入的值。因此,无论您有没有价值,您的bcp都可以使用。

如果要保留身份值,则使用情况不同。请参阅文档(bcp utility)中的-E参数