SQL Server:如何从另一个查询中执行 .sql 文件?

4
我有一个.sql脚本,其中包含许多操作查询,用于处理一些分段表。需要运行此脚本两次,并在其中加入其他命令,如下所示:
  1. 从源A加载分段表
  2. 使用do_stuff.sql进行处理
  3. 将结果移动到某处
  4. 重复1-3步骤以获取源B。
粗暴的方法是只需复制并粘贴dostuff.sql即可。虽然这在技术上可以工作,但是否有更好的方法呢?
我希望有像RunThisSQL 'C:\do_stuff.sql'这样的命令,但我还没有发现它。
更新
嗯,已经过去5年了,我重新发现了这个旧问题。最近,我创建了一个游标来循环遍历主表。对于主表中的每条记录,脚本会使用由主表设置的变量运行内部脚本。

https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/


5
为什么不将那个文件转换成存储过程? - Dan Bracuk
4
你是如何执行这个脚本的?一种方法是编写一个批处理/PowerShell例程,以在sqlcmd中运行你的脚本,类似于sqlcmd -SMyServer -ido_stuff.sql - voithos
1
@voithos,我是在MS SQL Server Management Studio中手动运行这个程序的。换句话说,打开.sql文件并点击执行。 - PowerUser
1
在 SQL 命令提示符中尝试使用此命令 **@'C:/do_stuff.sql';**。这适用于 Oracle。 - VKPRO
2
问题在于,当SQL代码实际运行时,它是在服务器上运行的。它不再与发送查询到服务器的SSMS实例有任何(真正的)关系,除了连接。而且,在TDS中没有任何内置功能可以允许它请求加载新文件并通过该连接发送。 - Damien_The_Unbeliever
显示剩余2条评论
4个回答

2
如果您使用的是Visual Studio,您可以创建“Sql Server Database”项目。在该项目中,您可以创建脚本,以便以某种方式执行*.sql文件。
 /*
Post-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be appended to the build script.       
 Use SQLCMD syntax to include a file in the post-deployment script.         
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the post-deployment script.       
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/

请参考:http://candordeveloper.com/2013/01/08/creating-a-sql-server-database-project-in-visual-studio-2012/

2

尝试使用xp_cmdshell。

 EXEC xp_cmdshell  'sqlcmd -S ' + @ServerName + ' -d ' + @DBName + ' -i ' +@FileName

1

xp_cmdshell和字符串连接在一起使用时往往会出现“+”附近的语法错误。因此,除了Jeotics的解决方案here之外,您还需要创建一个变量来存储传递给xp_cmdshell的整个字符串(包括引号,以防有空格的任何内容(例如filepath\filename))。这在Microsoft xp_cmdshell文档中提到here。您还需要处理SQL Server的默认设置,其中xp_cmdshell已禁用,如here所述,并向非系统管理员授予使用xp_cmdshell的权限,如here所述。文档通常建议不要赋予太多人使用xp_cmdshell的权限,因为它可能是那些恶意用户的工具,但如果像我一样只有少数值得信任的数据库用户,则似乎是一个合理的解决方案。最后一个需要正确配置的问题是SQL Server代理,如here所述。文档概述了SQL代理负责后台调度(例如备份)和执行命令行语句等的性能。
DECLARE
    @Server nvarchar (50)
    ,@Database nvarchar(50)
    ,@File nvarchar(100)
    ,@cmd nvarchar(300);

SET @Server = server_name;
SET @Database = database_name;
SET @File = 'C:\your file path with spaces';
SET @cmd = 'sqlcmd -S ' + @Server + ' -d ' + @Database + ' i "' + @File + '"';

EXEC xp_cmdshell @cmd;

1

在启用SQL Server中的xp_cmdshell时存在一些安全问题。您可以创建一个CLR存储过程,执行传递的文件内容。这个CLR存储过程是专门为此目的而设计的,不像xp_cmdshell可以在命令提示符上执行任何操作。

启用xp_cmdshell存在的问题

创建CLR存储过程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接