是否可以从SQL查询执行文本文件?

问题描述:

我有一些我想要连续运行的生成的.sql文件。我想从查询中的SQL语句(即查询分析器/服务器管理工​​作室)运行它们。
是否有可能做这样的事情,如果是这样做的语法是什么?是否可以从SQL查询执行文本文件?

我希望这样的事情:

exec 'c:\temp\file01.sql' 
exec 'c:\temp\file02.sql' 

我使用SQL Server 2005和运行管理工作室查询。

使用xp_cmdshellsqlcmd

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。

Using the osql Utility

一个qick搜索在堆栈溢出“OSQL”的显示了很多的东西是可用的。

正确处理的主要问题是在命令行中传递的用户和密码帐户参数。我看到使用NT文件访问权限的批处理文件用密码来控制文件,然后使用该文件的内容来启动脚本。您也可以编写一个快速的C#或VB程序来使用Process类运行它。

+1

我不知道快速搜索显示的是什么,但是OSQL是不推荐使用SQL Server 2005开始的SQLCMD。即使在使用SQL Server 2005的计算机上运行OSQL也会显示:“注意:osql不支持SQL Server 2005的所有功能。请改用sqlcmd。有关详细信息,请参阅SQL Server联机丛书“ – 2010-10-26 09:10:44

这就是我使用的。工作良好,易于重复使用。它可以被改变为读取目录中的所有文件,但是这样我可以控制执行哪些文件。

/* 
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 
+0

好的解决方案我还结合了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)