首页 > 解决方案 > 从 T-SQL 脚本中调用 T-SQL 命令的 *File*

问题描述

我需要将包含 T-SQL 过程的文件“注入”到许多 T-SQL 脚本中。类似的东西:

EXECUTE  '../CSV_From_Sql.sql', #CsvFileCreator <other parameters>

其中#CsvFileCreator 是“../CSV_Fro​​m_Sql.sql”中的入口点(即过程名称)。

请注意,#CsvFileCreator 生成的结果必须在调用脚本的范围/命名空间内(可从其访问)。

目前我不允许创建存储过程。为了满足范围要求,必须将#CsvFileCreator“注入”(复制)到每个脚本中。这必须以允许 #CsvFileCreator 在所有查询中同时更新(并最终转换为存储过程)的方式完成。

所需的效果实质上是“在此处插入文本”操作(即用文件的内容替换 EXECUTE 语句)。除了微软的文档似乎不允许这样做之外,这应该非常简单。

一些上下文:在我的例子中,SQL 服务器被用作 python 3.X GUI 报告生成器的后端。最终用户完全无法访问 SQL 代码,也没有注入的机会。所有用户可以做的就是做出选择(通过复选框、旋转框等)并按下“创建报告”按钮(这会导致 python 调用 SQL 服务器)。此外,应用程序的本质意味着它永远不会在连接到外部世界的网络上。

由于我不会深入讨论的原因,只能使用“纯”T-Sql 命令,并且无法使用任何类型的手动操作(例如使用 SSMS、bcp、sqlcmd 等工具)。就我而言,我可以在调用每个查询之前自动插入这个“样板程序”。

有没有纯T-SQL的方式来获得“执行文件”或“复制文件”的效果?

标签: sql-servertsql

解决方案


据我所知,不可能从存储过程中打开文本文件并执行其内容。而且,正如评论中所指出的,这对安全性有很大的影响。

话虽如此,可以使用sp_execute_sql. (有关完整详细信息,请参见此处。)您在哪里获得执行的文本块取决于您。

因此,一些可能性包括:

  • 将文本作为参数传递给脚本
  • 将文本作为标量函数的结果返回到脚本。(从来没有这样做过,但应该是可能的。)
  • 从表中读取要执行的文本

您提到“脚本”,也将它们称为“查询”。所以我假设这些是通过各种方式执行的,并且您没有一个执行它们的中央应用程序例程(并且可以预先修改以执行其他操作。)

最后的想法。T-SQL 不是一种可以轻松完成文件 IO 或文本处理的语言/环境,它不允许任何自省。但是,Windows(或其他操作系统)非常适合。

如果这些脚本作为“脚本”——文本文件——存在,您可以在 Windows 中编写一个程序来预处理它们并输出一个包含合并 SQL 的文件,然后执行该文件。正是您想要的,只是它发生在 Windows 而不是 T-SQL 中。


推荐阅读