我有许多生成的.sql文件,我想连续运行.我想从查询中的SQL语句(即查询分析器/服务器管理工作室)运行它们.
有可能做这样的事情,如果是这样的话,这样做的语法是什么?
我希望有类似的东西:
exec 'c:\temp\file01.sql' exec 'c:\temp\file02.sql'
我正在使用SQL Server 2005并在管理工作室中运行查询.
使用xp_cmdshell和sqlcmd
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
非常有用,谢谢,请参阅此链接:
执行
类似示例的SQL Server脚本.打开xp_cmdshell
和关闭如下:
上
SET NOCOUNT ON EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE EXEC master.dbo.sp_configure 'xp_cmdshell', 1 RECONFIGURE
离
EXEC master.dbo.sp_configure 'xp_cmdshell', 0 RECONFIGURE EXEC master.dbo.sp_configure 'show advanced options', 0 RECONFIGURE SET NOCOUNT OFF
这就是我使用的.效果很好,重用简单.可以将其更改为读取目录中的所有文件,但这样我就可以控制执行哪些文件.
/* execute a list of .sql files against the server and DB specified */ SET NOCOUNT ON SET XACT_ABORT ON BEGIN TRAN DECLARE @DBServerName VARCHAR(100) = 'servername' DECLARE @DBName VARCHAR(100) = 'db name' DECLARE @FilePath VARCHAR(200) = 'path to scrips\' /* create a holder for all filenames to be executed */ DECLARE @FileList TABLE (Files NVARCHAR(MAX)) INSERT INTO @FileList VALUES ('script 1.sql') INSERT INTO @FileList VALUES ('script 2.sql') INSERT INTO @FileList VALUES ('script X.sql') WHILE (SELECT COUNT(Files) FROM @FileList) > 0 BEGIN /* execute each file one at a time */ DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) Files FROM @FileList) DECLARE @command VARCHAR(500) = 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i "' + @FilePath + @Filename +'"' EXEC xp_cmdshell @command PRINT 'EXECUTED: ' + @FileName DELETE FROM @FileList WHERE Files = @FileName END COMMIT TRAN
或者只是使用openrowset将您的脚本读入变量并执行它(抱歉恢复一个8岁的主题):
DECLARE @SQL varchar(MAX) SELECT @SQL = BulkColumn FROM OPENROWSET ( BULK 'MeinPfad\MeinSkript.sql' , SINGLE_BLOB ) AS MYTABLE --PRINT @sql EXEC (@sql)
我不建议这样做,但如果你真的需要,那么扩展存储过程xp_cmdshell
就是你想要的.您必须先将文件内容读入变量,然后使用以下内容:
DECLARE @cmd sysname, @var sysname SET @var = 'Hello world' SET @cmd = 'echo ' + @var + ' > var_out.txt' EXEC master..xp_cmdshell @cmd
注意:xp_cmdshell在后台运行命令,因此,它不能用于运行需要用户输入的程序.