首页 > 解决方案 > 如何将文件内容作为数据导入表列

问题描述

我正在从事的一个项目涉及修改其中一个子系统以将当前存储在文件中的数据存储/提取到数据库中。每个文件都是由另一个自定义工具生成的单个、有时很大的自定义(基于 xml)脚本块。

从概念上讲,我正在寻找一种简单的方法来执行以下操作:

For Each file in folder_and_subfolders
    INSERT INTO table
    (script_name, version_num, script )
    VALUES
    ({file_name}, 1, {file_contents})
    ;
Next

最好一次在整个目录树上。

如果没有简单的方法通过 T-SQL 做到这一点,我可以编写一个实用程序来完成这项工作,但我更喜欢不需要编写另一个只会使用一次的自定义工具的东西。

标签: sql-server

解决方案


因此,我没有安装 SQL Server,因此无法对此进行测试,但如果您正在寻找一个可以完成您所追求的简单批处理文件,我建议以下内容可能会有所帮助;

@echo off

SET xmldir=./myxmlfiles/live/here/

echo --- Processing files

for %%f in ("%xmldir%*.xml") do (echo Running %%f.... && @sqlcmd -I -U %1 -P %2 -S %3 -d %4 -v filename="%xmldir%%%f" -i ProcessFile.sql)

不知道你对 sqlcmd 了解多少,但它是一个命令行工具,一般由 SQL Server 提供。它将允许您运行 SQL 命令,或者在上述情况下,运行由 -i 参数指示的脚本。我假设您将 SQL 语句放在那里以执行对表的添加。

sqlcmd 的其他参数如下所述;

-I将 QUOTED_IDENTIFIER 设置为开启(您可能需要也可能不需要。为之前遇到的 sqlcmd 和 QUOTED_IDENTIFIER 问题做过)

-U设置数据库用户名

-P设置数据库密码

-S设置数据库服务器

-d设置要连接的数据库

-v这是一个有趣的地方,因为它可以让你将参数传递给你的脚本。请注意,在描述这一点的MSDN 页面上,它指出如果您的路径或文件名包含空格,那么您需要将其括在引号中,因此请检查一下。基本上,您可以参考 sql 脚本 (ProcessFile.sql) 中的参数,例如INSERT INTO mytable (file_name) VALUES ('$(filename)')

您必须使用我之前评论的答案中描述的逻辑来确保


推荐阅读