跳过有 GO 的部分

MrT*_*TCS 5 sql-server sqlcmd sql-server-2012

我正在编写一个可以在新服务器上运行的脚本以进行一些初始配置。我希望能够跳过某些部分,但我遇到的问题是所需的“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
Run Code Online (Sandbox Code Playgroud)

问题是这行不通,因为您必须使用 GO。还有另一种方法吗?我试过搜索,但还没有找到任何东西。

Sol*_*zky 6

无论您是否使用 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;
Run Code Online (Sandbox Code Playgroud)

这在创建需要是批处理中唯一 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;');
Run Code Online (Sandbox Code Playgroud)


小智 4

我自己做了一些搜索,因为我注意到您在 SQLCMD 模式下运行此查询,并且我不知道它是否会有所不同。快速谷歌搜索,发现: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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!