【问题标题】:BCP import exclude identify or some columnBCP 导入排除标识或某些列
【发布时间】:2016-09-22 22:54:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server bcp


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      在您的情况下,即使您的 PK 列是标识列,您也必须在源文件中有该列。 SQL Server 将负责将列标识为标识,它会忽略您放在那里的值。所以你可以有任何价值,也可以没有,你的 bcp 会工作。

      如果您想保留身份值,这是一个不同的用例。参考文档中的 -E 参数 (bcp utility)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-21
        • 2011-06-01
        • 2013-02-19
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 2016-02-29
        相关资源
        最近更新 更多