TransactSQL运行另一个TransactSQL脚本
我有10个交易SQL脚本,每个脚本创build一个表并填充数据。
我正在试图创build一个主要的SQL脚本,将运行其他10个脚本中的每一个。
TSQL / TRANSACTSQL for Microsoft SQL Server 2008有没有办法从当前tsql脚本中执行另一个tsql脚本?
这旨在通过SQL Server Management Studio(SSMS)运行。
谢谢!
如果您尝试在SSMS中执行.sql文件,请尝试以下操作:
:r C:\Scripts\Script1.sql :r C:\Scripts\Script2.sql :r C:\Scripts\Script3.sql ...
如果这些脚本是经常运行的脚本,那么可以考虑将它们放在一个存储过程中,然后运行它们。
你也可以通过sqlcmd来实现(我相信这更常见):
sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
最简单的方法是使你的脚本存储过程,并从中央过程依次调用(通过EXECUTE
命令)每个过程。 如果您要一遍又一遍地运行完全相同的脚本(或传入不同参数的同一脚本),则这是理想的。
如果您的脚本是.sql(或任何types的文本)文件,就像@Abe Miesller所说(upvoted),当SQLCMD模式启用时,您可以通过:r命令在SSMS中运行它们。 你将不得不知道和脚本确切的文件path和名称。 这不能在存储过程中完成。
最后一种替代scheme,可以使用“已知”文件名,并且对于任意文件名(例如,当前加载到子文件夹中的所有文件)是必需的,这是利用扩展过程XP_CMDSHELL
。 这样的解决scheme可以非常快速地使用它(使用它来检索文件列表,通过xp_cmdshell构build和执行一个string调用每个文件的SQLCMD,通过输出文件pipe理结果和错误,它继续下去),所以我只做这个作为最后的手段。
您可以使用osql或更好,但更新的sqlcmd几乎可以互换。 我在这个例子中使用osql只是因为我碰巧有一个代码示例,但在生产中我正在使用sqlcmd。 下面是我用来针对数据库运行更新脚本的一个更大程序中的一段代码。 他们按主要,次要,发行版,命令的顺序进行sorting,因为我使用该约定来命名我的脚本来跟踪发行版。 你显然错过了我所有的error handling,从数据库中提取可用脚本的部分,设置variables等,但你仍然可以find这个片段有用。
我喜欢使用osql或sqlcmd的主要部分是,您可以在ssms中或者在存储过程(也可以按计划调用)或batch file中运行此代码。 非常灵活。
--Use cursor to run upgrade scripts DECLARE OSQL_cursor CURSOR READ_ONLY FOR SELECT FileName FROM #Scripts ORDER BY Major, Minor, Release, Build OPEN OSQL_cursor FETCH NEXT FROM OSQL_cursor INTO @name WHILE (@@fetch_status <> -1) BEGIN IF ((@@fetch_status <> -2) AND (@result = 0)) BEGIN SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"' EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT IF (@result = 0) BEGIN SET @Seconds = DATEDIFF(s, @LastTime, GETDATE()) SET @Minutes = @Seconds / 60 SET @Seconds = @Seconds - (@Minutes * 60) PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar) + ' minutes ' + cast(@Seconds as varchar) + ' seconds.' SET @LastTime = GETDATE() END ELSE BEGIN SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.' SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name SET @errMessage = @errMessage + ' manually in Query Analyzer.' END IF @name = (@UpToVersion + '.sql') GOTO CleanUpCursor --Quit if the final script specified has been run. END FETCH ENDT FROM OSQL_cursor INTO @name END
假设你想保留10个脚本在他们自己的单个文件中,我会说最简单的方法来做你想做的就是创build一个batch file,执行osql.exe来执行你想要的10个脚本。
或者使用openrowset将脚本读入一个variables并执行它:
DECLARE @SQL varchar(MAX) SELECT @SQL = BulkColumn FROM OPENROWSET ( BULK 'MeinPfad\MeinSkript.sql' , SINGLE_BLOB ) AS MYTABLE --PRINT @sql EXEC (@sql)