我有一个.sql脚本,其中包含许多可用于某些临时表的操作查询。这个脚本需要在其间使用其他命令运行两次,即:
do_stuff.sql
处理蛮力的方法是复制& amp;根据需要粘贴dostuff.sql。虽然这在技术上有用,但还有更好的方法吗?
我希望有一个我尚未发现的RunThisSQL 'C:\do_stuff.sql'
命令。
嗯,这已经有5年了,我刚刚重新发现了这个老问题。我最近这样做了,并使光标通过主表循环。对于该主表中的每个记录,该脚本使用主表设置的变量运行内部脚本。
https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/
答案 0 :(得分: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/
答案 1 :(得分:2)
尝试使用xp_cmdshell。
EXEC xp_cmdshell 'sqlcmd -S ' + @ServerName + ' -d ' + @DBName + ' -i ' +@FileName
答案 2 :(得分:1)
xp_cmdshell和串联不能很好地配合使用,通常会导致“'+'附近的语法不正确”错误。因此,除了上述Jeotics解决方案之外,您还需要对传递给xp_cmdshell的整个字符串做一个变量(包括可能包含空格的任何内容的引号(例如filepath \ filename)。在Microsoft文档中对此进行了提及) xp_cmdshell here。您还需要解决的其他问题是为SQL Server设置的默认设置,该设置已按照概述here禁用了xp_cmdshell,并向非系统管理员授予了使用概述{{3}的xp_cmdshell的权限}。该文档通常建议不要将xp_cmdshell权限授予过多的人,因为它是有缺陷的人的工具,但如果像我一样,您的数据库用户最少且值得信赖,那么这似乎是一个合理的解决方案。正确的配置是here所述的SQL Server代理。文档概述了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;
答案 3 :(得分:1)
在SQL Server中启用xp_cmdshell存在一些安全问题。您可以创建CLR存储过程,该过程执行传递的文件内容。此CLR存储过程是专门用于此目的的,与xp_cmdshell不同,xp_cmdshell可以在命令提示符下执行任何操作。