Sql-Server
如何以 DBName 為參數從另一個數據庫中動態提取數據?
我有一個主數據庫 (
MAIN
) 和幾個客戶端數據庫 (CLIENTDB
)。我需要開始查詢MAIN
並從中獲取數據CLIENTDB
。客戶端數據庫也可以在連結伺服器上找到。我的問題是我需要在一個函式中執行此操作EXEC
,所以我可以得到SELECT * FROM SRV.CLIENTDB
,但是 SQL Server 不允許這樣做。還有另一種方法嗎?我需要在函式內部有程式碼:
DECLARE @sSRV AS VARCHAR(128) = 'SRV'; DECLARE @sDB AS VARCHAR(128) = 'CLIENTDB1'; EXEC('SELECT * FROM ' + sSRV + '.' + @sDB + '.MyTable');
我需要一個函式,因為我需要在我的引擎中與它進行連接。
不可能通過 動態執行此操作
EXEC
,因為 IIRC 您無法在函式中執行此操作。您不能通過OPENROWSET
(https://msdn.microsoft.com/en-us/library/ms187569.aspx)使用臨時分佈式查詢,因為OPENROWSET
明確要求其輸入(包括查詢文本)是字元串文字而不是更通用字元串值(因此您不能使用表達式或變數)。我能想到的唯一方法是為每個遠端數據庫設置一個函式或
CASE/IF
瑪麗安評論中的建議。您可以通過在基於視圖和其他 DMV 的視圖中游標來實用地創建這樣的函式,以sys.servers
通過字元串連接將函式組合在一起,然後使用對EXEC
. 每次連結伺服器列表更改時,您仍然需要執行生成過程,但至少它只是一個過程呼叫(或腳本/語句執行),而不是更手動的程式碼更改。不過,這聽起來很老套。如果你有這樣的能力,這種“程式碼味道”表明重新設計是有必要的!