我正在尝试将 .txt 文件中的值批量加载到 MS SQL 表中,该文件格式非常棘手。下面的示例显示了文件的前两个部分,但这在整个文件中重复了 100 多次。标题位于每个部分的顶部。有什么办法可以处理这个吗?列本身是固定长度的,但我需要能够告诉 SQL 从表中获取值并忽略标题。有什么想法吗?
文件格式示例:
提前致谢。
我正在尝试将 .txt 文件中的值批量加载到 MS SQL 表中,该文件格式非常棘手。下面的示例显示了文件的前两个部分,但这在整个文件中重复了 100 多次。标题位于每个部分的顶部。有什么办法可以处理这个吗?列本身是固定长度的,但我需要能够告诉 SQL 从表中获取值并忽略标题。有什么想法吗?
文件格式示例:
提前致谢。
bcp.exe 或BULK INSERT
可让您过滤掉不需要的行的命令中没有参数或过滤器。因此,您必须进行预处理或后处理。
通过预处理,您可以使用您最了解的任何语言编写一个工具来解析输入文件并输出另一个文件,该文件可以作为批量插入的干净输入。
通过后处理,您可以将文件按原样加载到 SQL Server 中(包括不需要的行),然后从表中删除不需要的行。根据您的需要,您可能希望为此使用中间(临时)表。
首先创建一个格式文件以与批量插入一起使用。从您的输入看起来您可以使用固定大小的格式,这在这种情况下很好。您可能会变得很糟糕,date
在表中的“END on”列中使用一列,然后忽略任何错误。由于其他行似乎都不包含有效的日期格式,因此您可以将其用作粗过滤器。所有其他方式您都需要一个仅使用 (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 中有足够的空间。
我希望这能给你一些有用的想法。