2012-06-13 62 views
0

想有一個SQL腳本,在許多環境中工作,但對SQL02運行時,USE語句導致了其他環境的錯誤,即在下面的例子中,該USE [application],甚至內部的BEGIN ... END時?如何在BEGIN ... END塊中使用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 
       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 

回答

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 

另一種方法是使用dynamic sql,它會延遲編譯直到被調用。

+0

啊,剛剛試過這個** DROP USER [basic] **和三個部分名稱的語法是無效的:-( – SteveC

+0

爲那個(和任何其他類似的名稱)要麼使用動態sql或創建一個存儲過程usp_dropuser *在每個數據庫*中,並明確地用3部分名稱調用SP,後面的選項是不必要的複雜的imho,我會說動態sql在這種情況下是好的 –

+0

謝謝@remusrusanu – SteveC

相關問題