我正在尝试将.txt文件中的值批量加载到MS SQL表中,这些文件格式非常棘手。下面的示例显示了文件的前两个部分,但在整个文件中重复了100多次。标题位于每个部分的顶部。有什么方法可以解决这个问题吗?列本身是固定长度的,但我需要能够告诉SQL从表中获取值并忽略标题。有什么想法吗?
文件格式示例:
提前致谢。
答案 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中有足够的空间。
我希望这会给你一些有用的想法。