2011-03-08 84 views
49

我有10个交易SQL脚本,每个脚本创建一个表并填充数据。TransactSQL运行另一个TransactSQL脚本

我正在尝试创建1个主SQL脚本来运行其他10个脚本中的每一个。

TSQL/TRANSACTSQL有没有办法让Microsoft SQL Server 2008在当前的tsql脚本中执行另一个tsql脚本?

这旨在通过SQL Server Management Studio(SSMS)运行。

谢谢!

+1

? – 2011-03-08 19:21:55

+1

是的,我的意思是一个.sql文件。谢谢! – 2011-03-08 19:54:27

回答

83

试试这个,如果你想以执行SSMS .sql文件:

:r C:\Scripts\Script1.sql 
:r C:\Scripts\Script2.sql 
:r C:\Scripts\Script3.sql 
... 

注:此运行打开SQL命令模式(查询> SQLCMD模式)

如果这些你还算运行脚本时候你可以考虑在一个存储过程拖放和运行他们的方式......

你也可以做到这一点通过SQLCMD(我认为这是比较常见的):

sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql 
+3

':r'做什么?它在哪里记录?你能提供一个链接吗? – Oded 2011-03-08 19:28:20

+34

注意:在SSMS中使用:r需要打开SQLCMD模式:查询菜单 - > SQLCMD模式。 – 2011-03-08 19:30:54

+2

@Oded,给这个读:http://msdn.microsoft.com/en-us/library/ms174187.aspx':r'导入并执行一个文件。 – 2011-03-08 19:32:36

0

假设您希望将10个脚本保留在自己的单个文件中,我会说最简单的方法就是创建一个批处理文件,该文件执行osql.exe以按您的顺序执行10个脚本想。

+1

最好使用SQL 2005及更高版本的SQLCMD。支持所有的OSQL(和ISQL)功能,以及一些新增加的功能。 – 2011-03-08 19:36:34

+0

@菲利普凯利:谢谢你的提示。我不确定我错过了那一个。我想因为我在命令行上做的不多。 – 2011-03-08 19:42:59

+0

自从我打出了isql和osql之间隐藏但基本的区别之后,我在检查新版本时推出了它们 – 2011-03-08 22:15:23

3

最简单的方法是制作脚本存储过程,然后从中央过程依次调用每个过程(通过EXECUTE命令)。如果您要一遍又一遍地运行完全相同的脚本(或者传入不同参数的同一脚本),则这是理想的。

如果您的脚本是.sql(或任何类型的文本)文件,如@Abe Miesller说的(upvoted),您可以在启用SQLCMD模式时通过:r命令从SSMS内运行它们。您将不得不知道并编写确切的文件路径和名称。这不能在存储过程中完成。

对于任意文件名称(比如说,当前加载到子文件夹中的所有文件),可用于“已知”文件名称的最后一种替代方法是利用扩展过程XP_CMDSHELL的强大功能。这样的解决方案可以非常快速地使用它(使用它来检索文件列表,通过xp_cmdshell构建并执行一个字符串,然后依次调用每个文件的SQLCMD,通过输出文件管理结果和错误,它会继续下去),所以我只会做这个作为最后的手段。

3

您可以使用osql或更好,但更新的sqlcmd几乎可以互换。我在这个例子中使用osql只是因为我碰巧有一个代码示例,但在生产中我使用的是sqlcmd。下面是我用来针对数据库运行更新脚本的较大过程中的一段代码。他们按主要,次要,发布,构建命令,因为我使用该约定来命名我的脚本来跟踪发布。你显然错过了我所有的错误处理,从数据库中提取可用脚本的部分,设置变量等,但你仍然可以找到这个片段有用。

我喜欢使用osql或sqlcmd的主要部分是,您可以在ssms或存储过程(可能会按计划调用)或批处理文件中运行此代码。非常灵活。

--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 
1

或者只是使用OPENROWSET读你的脚本到一个变量并执行它:当你说的脚本你的意思是.sql文件

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

--PRINT @sql 
EXEC (@sql) 
相关问题