从不规则的平面文件批量插入MS SQL Server

时间:2013-10-04 10:31:30

标签: sql sql-server bulkinsert

我正在尝试将.txt文件中的值批量加载到MS SQL表中,这些文件格式非常棘手。下面的示例显示了文件的前两个部分,但在整个文件中重复了100多次。标题位于每个部分的顶部。有什么方法可以解决这个问题吗?列本身是固定长度的,但我需要能够告诉SQL从表中获取值并忽略标题。有什么想法吗?

文件格式示例:

Example screen shot here

提前致谢。

1 个答案:

答案 0 :(得分:0)

bcp.exe或BULK INSERT命令中没有参数或过滤器可用于过滤掉不需要的行。所以你必须进行预处理或后处理。

通过预处理,您可以使用您最熟悉的任何语言编写工具来解析输入文件,并输出另一个可作为批量插入的干净输入的文件。

通过后处理,您可以将文件原样加载到SQL Server中(包括不需要的行),然后从表中删除不需要的行。根据您的需要,您可能需要使用中间(临时)表。

首先创建一个format file以与批量插入一起使用。从您的输入看起来您可以使用固定大小的格式,这在这种情况下很好。您可以使用badass,在表格中的“END on”列中使用date列,然后忽略任何错误。由于其他行似乎都不包含有效的日期格式,因此您可以将其用作粗略过滤器。所有其他方式您需要一个仅使用(n)(var)char列的表定义。

使用这样的表格,您只需加载文件,然后使用WHERE过滤器删除在将数据传输到真实表格时无效的任何内容,如下所示:

INSERT INTO MyRealTable 
    SELECT CHOC_ID, EndOn, ... 
    FROM #TempBulkTable 
    WHERE CHOC_ID NOT IN ('untime', '---------------', ...)

或者您可以在批量插入中指定FIRE_TRIGGERS并为表格提供一个INSTEAD OF INSERT触发器来执行过滤 - 尽管这样做会破坏批量插入的目的。如果使用临时表,请确保tempdb中有足够的空间。

我希望这会给你一些有用的想法。