2016-01-20 40 views
0

我正在寻找更好的方法来尝试解决此问题,因为我当前的解决方案非常耗时且效率低下。TSQL批量插入:使用源文件名填充列

我有许多文本文件,都包含1列。

我使用BULK INSERT将该信息加载到SQL表中,但我希望能够告诉从哪个文件加载数据并将其填充到列中。

现有的工作流程是在文本编辑器创造了一系列BULK INSERT和UPDATE语句,然后如下运行它们一前一后:

现有的工作流程

CREATE TABLE #TEMP(MYDATA VARCHAR(MAX), FILENAME VARCHAR(MAX)) 

    BULK INSERT #TEMP FROM 'C:\MYFILE_1.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_1.TXT' WHERE FILENAME IS NULL 

    BULK INSERT #TEMP FROM 'C:\MYFILE_2.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_2.TXT' WHERE FILENAME IS NULL 

    BULK INSERT #TEMP FROM 'C:\MYFILE_3.TXT' WITH (FORMATFILE = 'C:\FORMATFILE.FRM') 

    UPDATE #TEMP SET FILENAME = 'MYFILE_3.TXT' WHERE FILENAME IS NULL 

这是一个可怕的工作流程,越慢越多的行被插入到表中。

有没有人有办法在做BULK INSERT或至少以更有效的方式做到这一点?

非常感谢

+1

你有没有考虑使用SSIS像这样的工作吗?当你有更复杂的工作流程等时,使用SSIS的好处变得更加明显。 –

+0

感谢您的回复@WindsofChange。不,我没有看过SSIS路线。你能给我一个关于如何实现这个目标的粗略工作流程,然后我会去做我自己的研究吗?谢谢 – Ninja

+0

SSIS是一个ETL(提取,转换,加载)工具。它允许你开发一个程序来加载和转换你正在加载的数据。例如,您可以加载数据源(作为参数传入,或者可以遍历文件夹并在其中加载所有内容)。您可以转换加载的数据以在列中包含硬编码值(例如数据源文件位置),然后使用该列将其批量插入到表中。 与仅编写SQL脚本相比,它涉及的内容更多,但对于受益于实际过程的ETL工作而言,它的灵活性要大得多。 –

回答

0

与大多数的问题,我相信有很多有效的方法可以做到这一点。但是,我会通过声明文件名变量,然后在批量插入文件中插入文件名来动态执行此操作。 这可能会有点复杂,并且可以很好地使用光标循环来完成。

另一种选择是将一列添加到txt文件,其中的文件名与文件名相同。我相信这可以通过PowerShell的等照本宣科..

我知道我的答案是模糊的,让我知道,如果你想举几个例子

+0

感谢您的回复@E。僧。我会看看变量选项。不幸的是我不能修改原来的文本文件,因为它们在特定的结构中。 – Ninja