是否可以从SQL查询执行文本文件?
我有一些我想要连续运行的生成的.sql文件。我想从查询中的SQL语句(即查询分析器/服务器管理工作室)运行它们。
是否有可能做这样的事情,如果是这样做的语法是什么?是否可以从SQL查询执行文本文件?
我希望这样的事情:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
我使用SQL Server 2005和运行管理工作室查询。
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
但我不推荐这样做,但如果你真的有那么扩展存储过程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的运行命令在后台,正因为如此,它不能用来运行程序,需要用户输入。
看看OSQL。该实用程序允许您从命令提示符运行SQL。安装在系统上很容易,我认为它带有免费的SQL Server Express。
一个qick搜索在堆栈溢出“OSQL”的显示了很多的东西是可用的。
正确处理的主要问题是在命令行中传递的用户和密码帐户参数。我看到使用NT文件访问权限的批处理文件用密码来控制文件,然后使用该文件的内容来启动脚本。您也可以编写一个快速的C#或VB程序来使用Process类运行它。
这就是我使用的。工作良好,易于重复使用。它可以被改变为读取目录中的所有文件,但是这样我可以控制执行哪些文件。
/*
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
好的解决方案我还结合了Archi Moore的答案来启用和禁用xp_cmdshell功能 – 2017-10-03 10:54:01
非常有帮助的感谢,也看到此链接: Execute SQL Server scripts 一个类似的例子。 要打开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
或者只是使用OPENROWSET读你的脚本到一个变量,并执行它(抱歉重振8年老主题):
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB) AS MYTABLE
--PRINT @sql
EXEC (@sql)
我不知道快速搜索显示的是什么,但是OSQL是不推荐使用SQL Server 2005开始的SQLCMD。即使在使用SQL Server 2005的计算机上运行OSQL也会显示:“注意:osql不支持SQL Server 2005的所有功能。请改用sqlcmd。有关详细信息,请参阅SQL Server联机丛书“ – 2010-10-26 09:10:44