2012-12-21 18 views
4

我需要在具有不同數據庫名稱但具有相同表格和數據的2個不同服務器中執行腳本。爲此, 我嘗試使用以下語句。使用帶條件語句的數據庫

if (@@servername= 'srvrA') 
    begin 
     use dbA 
    end 
else  
begin 
     use dbB 
    end 

但srvrB,它說數據庫分貝不存在。

有人可以幫我實現這個嗎?

+1

對於這樣的問題,我懷疑這可能是特定的數據庫,所以可能值得增加了對您所使用的數據庫引擎的標籤。 – PeterJ

+1

我剛剛進行了一項實驗,問題是即使表達式計算結果爲false,dbA的存在也會被檢查。我認爲這是在EXEC聲明中的工作,但進一步檢查它沒有改變數據庫,它仍然使用默認值。我猜如果沒有好的解決方案出現,你可以創建一個空的數據庫模式來解決它。或者可以在命令行上調用指定數據庫的腳本,並完全刪除USE。 – PeterJ

回答

1

一個更多的選擇

喜歡的東西:

sp_addlinkedserver 
    @server= N'srvrA', 
    @srvproduct= N'', 
    @provider= N'SQLNCLI', 
    @datasrc= N'srvrA'; 

sp_addlinkedsrvlogin 
    @rmtsrvname = 'srvrA' , 
    @useself = 'FALSE' , 
    @locallogin = 'your_local_login' , 
    @rmtuser = 'your_remote_login' , 
    @rmtpassword = 'your_password' 

然後你的腳本看起來像

DECLARE @@srvname nvarchar(10) = 'srvrA' 

IF (@@servername = @@srvname) 
    BEGIN 
    SELECT * 
    FROM srvrA.dbA.your_schema.your_table 
    END  
ELSE  
    BEGIN 
    SELECT * 
    FROM srvrB.dbB.your_schema.your_table 
    END  
-1

如果啓用SQLCMD模式,則可以實現您的目標。從sql管理工作室的查詢菜單中切換SQLCMD模式。然後下面的腳本將工作。

if (@@servername = 'srvrA') 
    begin 
     :setvar dbname dbA 
     use $(dbname) 
    end 
else  
    begin 
     :setvar dbname dbB 
     use $(dbname) 
    end 
+1

這不起作用。在執行腳本之前設置SQLCMD變量。 'dbname'將始終是最後一個':setvar'的值 –