sql-server - 从 T-SQL 脚本中调用 T-SQL 命令的 *File*
问题描述
我需要将包含 T-SQL 过程的文件“注入”到许多 T-SQL 脚本中。类似的东西:
EXECUTE '../CSV_From_Sql.sql', #CsvFileCreator <other parameters>
其中#CsvFileCreator 是“../CSV_From_Sql.sql”中的入口点(即过程名称)。
请注意,#CsvFileCreator 生成的结果必须在调用脚本的范围/命名空间内(可从其访问)。
目前我不允许创建存储过程。为了满足范围要求,必须将#CsvFileCreator“注入”(复制)到每个脚本中。这必须以允许 #CsvFileCreator 在所有查询中同时更新(并最终转换为存储过程)的方式完成。
所需的效果实质上是“在此处插入文本”操作(即用文件的内容替换 EXECUTE 语句)。除了微软的文档似乎不允许这样做之外,这应该非常简单。
一些上下文:在我的例子中,SQL 服务器被用作 python 3.X GUI 报告生成器的后端。最终用户完全无法访问 SQL 代码,也没有注入的机会。所有用户可以做的就是做出选择(通过复选框、旋转框等)并按下“创建报告”按钮(这会导致 python 调用 SQL 服务器)。此外,应用程序的本质意味着它永远不会在连接到外部世界的网络上。
由于我不会深入讨论的原因,只能使用“纯”T-Sql 命令,并且无法使用任何类型的手动操作(例如使用 SSMS、bcp、sqlcmd 等工具)。就我而言,我可以在调用每个查询之前自动插入这个“样板程序”。
有没有纯T-SQL的方式来获得“执行文件”或“复制文件”的效果?
解决方案
据我所知,不可能从存储过程中打开文本文件并执行其内容。而且,正如评论中所指出的,这对安全性有很大的影响。
话虽如此,可以使用sp_execute_sql
. (有关完整详细信息,请参见此处。)您在哪里获得执行的文本块取决于您。
因此,一些可能性包括:
- 将文本作为参数传递给脚本
- 将文本作为标量函数的结果返回到脚本。(从来没有这样做过,但应该是可能的。)
- 从表中读取要执行的文本
您提到“脚本”,也将它们称为“查询”。所以我假设这些是通过各种方式执行的,并且您没有一个执行它们的中央应用程序例程(并且可以预先修改以执行其他操作。)
最后的想法。T-SQL 不是一种可以轻松完成文件 IO 或文本处理的语言/环境,它不允许任何自省。但是,Windows(或其他操作系统)非常适合。
如果这些脚本作为“脚本”——文本文件——存在,您可以在 Windows 中编写一个程序来预处理它们并输出一个包含合并 SQL 的文件,然后执行该文件。正是您想要的,只是它发生在 Windows 而不是 T-SQL 中。
推荐阅读
- python - python代码提取PDF中突出显示的文本并创建一个包含此突出显示文本的新PDF
- php - 如何获得排名并列分数?
- excel - 使用 PasteSpecial 时收到错误消息“预期行尾”
- javascript - 页面显示 javascript 日志,但未加载我的 swf
- python - 重复图像检测器不删除所有重复文件
- swift - 无法从请求中获取模型
(Vimeo 网络) - powershell - 以管理员提示运行的 Powershell 脚本即将到来
- android - 领域数据库 DynamicRealmObject 在迁移期间无效
- mysql - Mysql中的WHERE子句不区分大小写吗?
- .net - Inno setup 在创建安装程序之前编译项目