2012-02-28 45 views
0

嗨,我正試圖讓聰明的想法如何實現這一點。我有一個表T1,其中有一列名爲「服務器」的列,其中包含整個鏈接服務器名稱列表。我想查詢每個鏈接的服務器上的一些表,並使用結果來填充此表的其他列,例如DB_Nmaes。T-SQL使用鏈接的服務器查詢結果來填充本地表格

理想的結果表之後會是這樣

T1我能想到的

 
Servers DB_Names Datafile_Size, …. 
S1 D1 2M S1 D2 3M S1 D3 5M S2 D1 3M S2 D2 6M . . .

一種方法是遍歷整個表T1,構建一個動態SQL在每個循環查詢相應的鏈接服務器並插入到其他字段的DB_Names和Datafile_size。 但我試圖避免這樣做,因爲我在該列中有很多鏈接的服務器行。有沒有什麼辦法可以通過使用基於集合的操作來實現?

謝謝。

+0

[[DB_Names]]是否也與[[Servers]一起開始填充? – squillman 2012-02-28 21:53:06

+0

是的,開始時DB_NAMES AND Datafile_size都是NULL。我們只有包含所有鏈接服務器名稱的服務器列作爲數據。我想在每行上查詢類似於S1.sys.master.databases的內容,所以我期待的結果就像現在在T1中顯示的一樣。謝謝 – user1238837 2012-02-28 21:55:36

+0

還有一件事,你只對列表中的數據庫感興趣,並不一定是該服務器上的所有數據庫? – squillman 2012-02-28 21:57:21

回答

0

既然你想要遠程服務器上的所有數據庫,我會考慮改用2表方法。你的第一個表格將是一個包含你想查詢的所有鏈接服務器的表格。然後,您需要循環遍歷一個將制定動態SQL語句的光標,以便通過鏈接的服務器進行調用。

+0

我很樂意在短時間內發佈一些示例代碼......儘管現在在工作中仍處於緊縮狀態。 – squillman 2012-02-28 22:50:51

0

我也建議將結果存儲在單獨的表中。那麼你可以用這種方式來處理它:

CREATE TABLE ServerDbs (LinkedServer VARCHAR(100), DbName VARCHAR(100)) 

DECLARE @q VARCHAR(MAX) 
SET @q = 
    (SELECT 'INSERT INTO ServerDbs SELECT ''' + T.Server + ''', name FROM ' + T.Server + '.master.sys.databases' 
    FROM T 
    FOR XML PATH('')) 

EXEC (@q) 
相關問題