如何在BEGIN ... END块中使用USE?

时间:2012-06-13 09:33:54

标签: sql-server tsql

尝试使用一个可在多种环境中运行的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

1 个答案:

答案 0 :(得分:2)

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

-- 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

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