【问题标题】:Importing non-existing rows using BCP/BULK IMPORT (SQL Server)使用 BCP/BULK IMPORT (SQL Server) 导入不存在的行
【发布时间】:2018-10-10 18:53:08
【问题描述】:

我正在尝试将文件加载到 SQL Server 数据库中。我熟悉使用批量导入和使用 BCP 生成格式文件来重组列。但是,我正在尝试做两件我以前从未尝试过的新事情。

我收到了要加载到数据库中的大量单独的 CSV,每个单独的文件代表几年中的一天。我希望能够使用实用程序来加载它们,但它们有不同数量的列(当然,是单独的文件!)。我正在考虑创建一个加载存储过程,并使用 PowerShell 对文件进行迭代,但即便如此,我也想不出一个好方法来处理不同数量的列。

这些列是一致的,只是这些文件多年来添加了列。我希望能够导入具有较少列的文件,让不存在的列作为空值进入。 BCP 支持吗?

我宁愿不必弄清楚每列何时添加并为每组日期编写不同的存储过程/脚本(这是我能想出的唯一解决方案!)。有什么建议吗?

谢谢!

【问题讨论】:

    标签: sql-server sql-server-2012 bulk-import


    【解决方案1】:

    我能想到的唯一方法是使用过程编码。您可以编写控制台应用程序,也可以编写带有脚本任务的 SSIS 包。无论哪种方式,您都需要遍历文件,并在循环内检查内容以查看缺少哪些列,然后导入为任何缺少的列提供一些硬编码值的文件。

    BCP 可以通过使用格式文件来处理缺少列的文件,但它不能动态处理(事先不知道缺少哪些列)。

    【讨论】:

    • 好的。我想我可以通过使用 powershell 的 import-CSV 添加空白列和 BCP 格式文件来将这些空白列作为空值来完成这项工作。感谢您的建议!
    【解决方案2】:

    对于那些关注的人-

    我通过使用 Powershell 将所有文本文件连接到一个大文本文件中解决了这个谜题(因为无论如何我们只是将它们全部加载到一个数据库表中)。一旦我有一个文件要上传,我在 SSIS 中创建了一个平面文件到 OLE-DB 的连接程序,并使用它的数据转换和派生列任务将值转换为指定字段的所需值。 SSIS 是一种非常快速的方法,可以在打包后上传数据,在几秒钟内即可通过数百万行。如果您选择走这条路线,请注意以下几点:

    如果您要上传大量文本文件并选择将它们连接起来,请注意文件可能会变得太大而无法直接读取。 SSIS 具有“数据查看器”工具,可用于故障排除,这些工具可让您查看文件内容,无论文件大小(因为您一次将读取 1,000 行)。但是,很明显,这会严重降低您的速度,因此最好先测试您的脚本,然后再处理 S​​SIS 包。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 2013-10-18
      • 2020-04-06
      • 2020-05-07
      • 2019-02-21
      • 1970-01-01
      • 2011-01-08
      • 2013-01-13
      • 2015-10-29
      相关资源
      最近更新 更多