Sql-Server

如何以 DBName 為參數從另一個數據庫中動態提取數據?

  • December 14, 2016

我有一個主數據庫 ( 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 您無法在函式中執行此操作。您不能通過OPENROWSEThttps://msdn.microsoft.com/en-us/library/ms187569.aspx)使用臨時分佈式查詢,因為OPENROWSET明確要求其輸入(包括查詢文本)是字元串文字而不是更通用字元串(因此您不能使用表達式或變數)。

我能想到的唯一方法是為每個遠端數據庫設置一個函式或CASE/IF瑪麗安評論中的建議。您可以通過在基於視圖和其他 DMV 的視圖中游標來實用地創建這樣的函式,以sys.servers通過字元串連接將函式組合在一起,然後使用對EXEC. 每次連結伺服器列表更改時,您仍然需要執行生成過程,但至少它只是一個過程呼叫(或腳本/語句執行),而不是更手動的程式碼更改。

不過,這聽起來老套。如果你有這樣的能力,這種“程式碼味道”表明重新設計是有必要的!

引用自:https://dba.stackexchange.com/questions/158110