0

试图让单个 SQL 脚本适用于多个环境,但该USE语句会导致其他环境出错,即在下面的示例中,当针对 SQL02 运行时USE [application],即使在BEGIN ... END?

-- connected to SQL02
DECLARE @STAGE INTEGER = 3
IF @@SERVERNAME = 'SQL02' 
    SET @STAGE = 1
IF @@SERVERNAME = 'SQL03' 
    SET @STAGE = 2

IF @STAGE = 1 
    BEGIN
        IF EXISTS ( SELECT  *
                    FROM    [application_tst].[sys].[database_principals]
                    WHERE   name = N'qauser' ) 
            BEGIN
                USE [application_tst]
                --rest of code
            END
    END

IF @STAGE = 2 
    BEGIN
        IF EXISTS ( SELECT  *
                    FROM    [application].[sys].[database_principals]
                    WHERE   name = N'qauser' ) 
            BEGIN
                USE [application]
                --rest of code
            END
    END
4

1 回答 1

2

您将需要在任何地方使用明确的三部分名称,而不是使用USE. USE 是一个执行时间命令,您的批处理将无法按预期编译,因为您希望名称解析发生,就像在编译期间执行USE 一样。

-- connected to SQL02
DECLARE @STAGE INTEGER = 3
IF @@SERVERNAME = 'SQL02' 
    SET @STAGE = 1
IF @@SERVERNAME = 'SQL03' 
    SET @STAGE = 2

IF @STAGE = 1 
    BEGIN
        IF EXISTS ( SELECT  *
                    FROM    [application_tst].[sys].[database_principals]
                    WHERE   name = N'qauser' ) 
            BEGIN
                select from [application_tst].dbo.table
                insert into [application_tst].dbo.table
                --rest of code, using explicit 3 part names
            END
    END

IF @STAGE = 2 
    BEGIN
        IF EXISTS ( SELECT  *
                    FROM    [application].[sys].[database_principals]
                    WHERE   name = N'qauser' ) 
            BEGIN
                select from [application].dbo.table
                insert into [application].dbo.table
                --rest of code, using explicit 3 part names
            END
    END

另一种方法是使用动态 sql,这将延迟编译直到被调用。

于 2012-06-13T09:50:27.227 回答