【问题标题】:SQL Server BCP insert additional columnsSQL Server BCP 插入附加列
【发布时间】:2026-02-21 08:20:02
【问题描述】:

我的要求:

输入文件:

1,abc,xyx

2,def,mno

3,ghi,suv

数据库表结构:

Col1 字符

col2 字符

col3 字符

col4 字符

col5 字符

BCP后表中的数据:

col1 col2 col3 col4 col5

1 abc xyz ab xy

2 def mno de mn

3 ghi suv gh su

基本上 col4 和 col5 是根据 col2 和 col3 值计算得出的值。

SQL Server BCP 实用程序是否支持此类操作?任何指针将不胜感激。

干杯 GT

【问题讨论】:

  • 如果 col4 和 col5 是表中现有列的计算值,为什么不使用计算列创建目标表。如果您需要索引它们,则将它们设置为持久。您可以按照下面的@edosoft 答案使用 BCP,从源中导出数据,然后将其导入。那么你根本不需要担心填充 col4 和 col5

标签: sql sql-server bcp


【解决方案1】:

您可以使用格式文件来指定哪个数据字段映射到哪个列

使用 bcp 导入时可以使用格式文件:

为您的表格创建一个格式文件:

 bcp [table_name] format nul -f [format_file_name.fmt] -c -T 

这将创建一个像这样的文件:

 9.0
5
1       SQLCHAR       0       100     ","      1     Col1             SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       100     ","      2     Col2             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     Col3           SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       100     ","      3     Col4           SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR       0       100     ","      3     Col5           SQL_Latin1_General_CP1_CI_AS

编辑导入文件。诀窍是删除您不需要的列(本例中的字段 4 和 5)并更新列数:这是格式文件中的第二行。在此示例中,将 5 更改为 3。 然后使用此格式文件导入数据,指定您的输入文件、此格式文件和分隔符:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 

【讨论】:

  • 这是一个很棒的技巧,谢谢!我要补充一点,如果您要删除不在表末尾的行,则需要重新编号“主机文件字段顺序”,即此格式文件中的第一列数字。我发现有关这些“非 xml 格式文件”结构的信息非常有用:msdn.microsoft.com/en-AU/library/ms191479.aspx
【解决方案2】:

您可以 BCP 进入一个临时表,然后从该临时表以适当的结构插入到另一个表中。

您还可以在 SQL 中使用 BULK INSERT 与外部 BCP 命令中相同的格式文件和源文件,以便您可以在 SQL 中运行整个批处理:BULK INSERT 到表匹配输入,然后INSERT INTO决赛桌。

另一个预处理选项,如 Perl(或任何其他命令行工具)是 PowerShell,用于在使用 BCP(可能与 XML 选项)之前通过管道传输数据:http://www.sqlservercentral.com/articles/powershell/65196/

我首选的选项可能是 SSIS,它为您提供了整个转换库,包括派生列。

【讨论】:

    【解决方案3】:

    不,您不能使用 BCP 执行此操作,尽管您可以使用 BCP 从查询中提取数据集并转储到文件中。

    如果您想在不使用源查询的情况下执行此操作,则必须将 bcp 输出到文件,使用 perl 脚本或类似脚本对文件进行后处理以生成计算列,然后重新导入文件使用适当格式的 BCP 控制文件到目的地。

    编辑: BCP 相当简单。如果您不能使用客户端工具,您可以将其插入临时表,然后在存储过程中计算派生值。

    【讨论】:

    • 它有没有类似普通 SQL 插入命令的东西,我们可以在其中插入计算值?由于某些限制,我不能为此使用 PERL/其他。
    • 不,它相当简单。如果您不能使用客户端工具,您可以插入临时表,然后在存储过程中计算派生值。
    【解决方案4】:

    SQL Server 集成服务和转换将是我选择的方法。它是一个非常简单的包来构建所需的转换 - 而且 SSIS 非常快,易于安排等。

    【讨论】:

      【解决方案5】:

      如果您不怕编程,可以使用 ADO.NET 来完成。通过实现自定义 IDataReader,可以轻松完成此操作以及您希望即时进行的任何其他转换。 SqlBulkCopy 采用 IDataReader 并批量插入它提供的数据。然后,您的读者可以使用输入文件并提供其他列、转换数据、查找键值等等。

      【讨论】: