Sql-Server

跳過有 GO 的部分

  • December 9, 2014

我正在編寫一個可以在新伺服器上執行的腳本來進行一些初始配置。我希望能夠跳過某些部分,但我遇到的問題是所需的“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

希望這可以幫助!

引用自:https://dba.stackexchange.com/questions/84708