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

时间:2008-10-28 01:07:47

标签: sql sql-server sql-server-2005

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

我希望有类似的东西:

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

我正在使用SQL Server 2005并在管理工作室中运行查询。

9 个答案:

答案 0 :(得分:46)

使用xp_cmdshellsqlcmd

EXEC xp_cmdshell  'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FilePathName

答案 1 :(得分:16)

非常有用,谢谢,请参阅此链接: 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 

答案 2 :(得分:6)

这就是我使用的。效果很好,重用简单。可以将其更改为读取目录中的所有文件,但这样我就可以控制执行哪些文件。

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

答案 3 :(得分:5)

我不建议这样做,但如果你真的需要,那么扩展存储过程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在后台运行命令,因此,它不能用于运行需要用户输入的程序。

答案 4 :(得分:5)

或者只是使用openrowset将您的脚本读入变量并执行它(抱歉恢复一个8岁的主题):

DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
    (   BULK 'MeinPfad\MeinSkript.sql'
    ,   SINGLE_BLOB ) AS MYTABLE

--PRINT @sql
EXEC (@sql)

答案 5 :(得分:3)

看看OSQL。此实用程序允许您从命令提示符运行SQL。它很容易安装在系统上,我认为它附带了免费的SQL Server Express。

Using the osql Utility

在堆栈溢出上搜索“OSQL”会显示很多东西可用。

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

答案 6 :(得分:2)

对于Windows身份验证,如果您以其他用户身份运行: 以Windows用户身份打开命令提示符(右键单击,打开文件位置,Shift +右键单击,以其他用户身份运行)

 sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql"

或者如果您使用的是Sql Server用户:

sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql" -U UserName -P Password

如果不是本地服务器,请用服务器名称替换localhost \ SQLEXPRESS。

答案 7 :(得分:1)

对于像我一样绊脚问这个问题并且可能会发现它有用的人,我喜欢Bruce Thompson's answer(从循环文件中运行SQL),但是我更喜欢Pesche Helfer's approach to file execution(因为避免使用xp_cmdshell )。

因此,我将两者结合在一起(并对其进行了一些微调,以便它从文件夹而不是手动创建的列表中运行所有内容):

DECLARE @Dir NVARCHAR(512) = 'd:\SQLScriptsDirectory'

DECLARE @FileList TABLE (
  subdirectory NVARCHAR(512),
  depth int,
  [file] bit
)

INSERT @FileList
EXEC Master.dbo.xp_DirTree @Dir,1,1

WHILE (SELECT COUNT(*) FROM @FileList) > 0  
BEGIN  
   DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) subdirectory FROM @FileList) 
   DECLARE @FullPath NVARCHAR(MAX) = @Dir + '\' + @FileName

   DECLARE @SQL NVARCHAR(MAX)
   DECLARE @SQL_TO_EXEC NVARCHAR(MAX)
   SELECT @SQL_TO_EXEC = 'select @SQL = BulkColumn
   FROM OPENROWSET
       (   BULK ''' + @FullPath + '''
       ,   SINGLE_BLOB ) AS MYTABLE'

   DECLARE @parmsdeclare NVARCHAR(4000) = '@SQL varchar(max) OUTPUT'  

   EXEC sp_executesql @stmt = @SQL_TO_EXEC
                 , @params = @parmsdeclare
                 , @SQL = @SQL OUTPUT  

   EXEC (@sql)
   DELETE FROM @FileList WHERE subdirectory = @FileName  

   PRINT 'EXECUTED: ' + @FileName     
END

答案 8 :(得分:0)

打开Windows命令行(CMD)

sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"