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。还有另一种方法吗?我试过搜索,但还没有找到任何东西。
无论您是否使用 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)
希望这可以帮助!