Sql-Server
跳過有 GO 的部分
我正在編寫一個可以在新伺服器上執行的腳本來進行一些初始配置。我希望能夠跳過某些部分,但我遇到的問題是所需的“GO”。由於 GO,我無法將我的程式碼部分包裝在 IF 語句中。例如
:setvar EnableDBMail 0 IF ($(EnableDBMail) = 1 ) BEGIN sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Database Mail XPs', 1; GO RECONFIGURE GO END ....etc
問題是這行不通,因為您必須使用 GO。還有另一種方法嗎?我試過搜尋,但還沒有找到任何東西。
無論您是否使用 SQLCMD 模式,您始終可以通過將呼叫包裝在
EXEC()
. 例如:IF ($(EnableDBMail) = 1 ) BEGIN EXEC('sp_configure ''show advanced options'', 1;'); EXEC('RECONFIGURE;'); EXEC('sp_configure ''Database Mail XPs'', 1;'); EXEC('RECONFIGURE;'); END;
這也適用於創建需要成為批處理中唯一 CREATE 的對象,例如:儲存過程、函式、觸發器、視圖等。以下是單個批處理,可以包裝在一個
IF
或其他任何內容中:CREATE TABLE dbo.MyTable ( Col1 NVARCHAR(256) NOT NULL ); EXEC(' CREATE PROCEDURE dbo.Proc1 ( @Param1 INT ) AS SET NOCOUNT ON; SELECT field FROM table; '); EXEC('ALTER TABLE dbo.MyTable ADD Col2 DATETIME NULL;');
我自己做了一些搜尋,因為我注意到您在 SQLCMD 模式下執行此查詢,我不知道它是否會有所不同。做了一個快速的Google搜尋,發現:https ://stackoverflow.com/questions/3988199/how-to-use-sp-configure-in-another-stored-procedure
基本上,“GO”只是 SSMS 中的批處理分隔符,您應該能夠使用“EXEC”執行這些命令。“GO”告訴伺服器您已經結束了 TSQL 批處理,並且不再繼續執行其他任何東西。由於您需要使用 RECONFIGURE 跟進 sp_reconfigure,因此在它們之間放置“GO”會破壞您使用“BEGIN”和“END”指定的程式碼塊。通過開發環境執行它:
:setvar EnableDBMail 1 -- did this to make sure it works IF ($(EnableDBMail) = 1) BEGIN EXEC sp_reconfigure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'database Mail XPs', 1; RECONFIGURE; END
希望這可以幫助!