我有一些生成的.sql文件,想要按顺序运行它们。我希望可以通过查询语句(如Query Analyzer/Server Management Studio)来运行它们。
是否可能实现这样的目标,如果是,语法是什么?
我希望可以使用类似以下的方式:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
我正在使用SQL Server 2005,并在管理工具中运行查询。
我有一些生成的.sql文件,想要按顺序运行它们。我希望可以通过查询语句(如Query Analyzer/Server Management Studio)来运行它们。
是否可能实现这样的目标,如果是,语法是什么?
我希望可以使用类似以下的方式:
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
,请参见下文:打开
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
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)
这是我使用的方法。它很有效,而且简单易用。可以将其更改为读取目录中的所有文件,但这样我就可以控制要执行哪些文件。
/*
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
我不建议这样做,但如果你确实需要的话,可以使用扩展存储过程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在后台运行命令,因此不应用于运行需要用户输入的程序。
对于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替换为您的服务器名称。
打开Windows命令行(CMD)
sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
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