【问题标题】:How to import file contents into table column as data如何将文件内容作为数据导入表列
【发布时间】:2019-01-28 16:32:43
【问题描述】:

我正在从事的一个项目涉及修改其中一个子系统以将当前存储在文件中的数据存储/提取到数据库中。每个文件都是由另一个自定义工具生成的单个、有时很大的自定义(基于 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 做到这一点,我可以编写一个实用程序来完成这项工作,但我更喜欢不需要编写另一个自定义工具的东西用过一次。

【问题讨论】:

  • SSIS 可以很容易地使用 For Each 循环容器来实现这一点;并且是 SQL Server Standard+ 的一部分。 T-SQL(单独使用)可能更难实现这一目标。
  • 是的,没有。你当然可以通过启用xp_cmdshell 来读取和读取文件,然后你会看到一些讨厌的游标循环来处理这些命令的结果。如果可以的话,反转控制流并从客户端执行此操作——您不需要为此编写单独的工具; PowerShell 应该可以在任何最近的 Windows 服务器上使用,包括 SQL Server 本身。 (以我个人的拙见和经验:避免像瘟疫一样避免 SSIS,尽管我承认在这种情况下这是一种选择。)
  • @EzLo,我不认为这是重复的。这不是包含要插入到表的多行中的批量数据的文件。这是多个文件,每个文件包含一条数据
  • 至少this help 是如何引用文件内容的吗?您仍然需要弄清楚如何遍历所需的所有文件,但也许它可能是 sqlcmd 和该答案中引用的查询以及批处理或 powershell 脚本的组合。

标签: sql-server


【解决方案1】:

所以,我没有安装 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 设置为开启(您可能需要也可能不需要。I did 用于我之前遇到的 sqlcmd 和 QUOTED_IDENTIFIER 问题)

-U设置数据库用户名

-P设置数据库密码

-S设置数据库服务器

-d 设置要连接的数据库

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多