1

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

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

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

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

谢谢!

4

2 回答 2

1

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

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

于 2018-10-10T19:52:40.820 回答
0

对于那些追随者——

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

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

祝你好运!

于 2018-10-15T14:13:46.573 回答