我需要在具有不同數據庫名稱但具有相同表格和數據的2個不同服務器中執行腳本。爲此, 我嘗試使用以下語句。使用帶條件語句的數據庫
if (@@servername= 'srvrA')
begin
use dbA
end
else
begin
use dbB
end
但srvrB,它說數據庫分貝不存在。
有人可以幫我實現這個嗎?
我需要在具有不同數據庫名稱但具有相同表格和數據的2個不同服務器中執行腳本。爲此, 我嘗試使用以下語句。使用帶條件語句的數據庫
if (@@servername= 'srvrA')
begin
use dbA
end
else
begin
use dbB
end
但srvrB,它說數據庫分貝不存在。
有人可以幫我實現這個嗎?
一個更多的選擇
添加鏈接的服務器登錄本地實例和遠程服務器之間sp_addlinkedserver
喜歡的東西:
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
如果啓用SQLCMD模式,則可以實現您的目標。從sql管理工作室的查詢菜單中切換SQLCMD模式。然後下面的腳本將工作。
if (@@servername = 'srvrA')
begin
:setvar dbname dbA
use $(dbname)
end
else
begin
:setvar dbname dbB
use $(dbname)
end
這不起作用。在執行腳本之前設置SQLCMD變量。 'dbname'將始終是最後一個':setvar'的值 –
對於這樣的問題,我懷疑這可能是特定的數據庫,所以可能值得增加了對您所使用的數據庫引擎的標籤。 – PeterJ
我剛剛進行了一項實驗,問題是即使表達式計算結果爲false,dbA的存在也會被檢查。我認爲這是在EXEC聲明中的工作,但進一步檢查它沒有改變數據庫,它仍然使用默認值。我猜如果沒有好的解決方案出現,你可以創建一個空的數據庫模式來解決它。或者可以在命令行上調用指定數據庫的腳本,並完全刪除USE。 – PeterJ