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

どこでも明示的な 3 部構成の名前を使用する必要があり、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 に答える