2011-03-08 113 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) 
相關問題