2013-02-18 44 views
4

鏈接一些SQL Server 2008服務器/實例後,我想對這些服務器進行更一般的查詢。我知道,我必須指定像查詢的命運:如何查詢多個鏈接的服務器?

select * 
from [SRV\INSTANCE].dbname.dbo.foo 

不過,我會跑對多個鏈接服務器此查詢。我也知道,這個select語句返回完全SRV\INSTANCE我需要:

select ss.name 
from sys.servers ss 
where ss.server_id > 0 

這一次,返回從那裏我想對查詢所有servers\instances

在這種情況下,所有數據庫都具有相同的結構,所以我想要做這樣的事情:

select * 
from [select ss.name from sys.servers ss where ss.server_id > 0].DBNAME.dbo.foo 

任何想法?

在此先感謝。

+0

性能將會變差。您可能需要考慮一個運行於作業/事件上的存儲過程,該作業/事件使用感興趣的數據填充臨時表。這種方式在查詢之前完成了繁重的工作,現在您正在做一個跨數據庫選擇而不是多個數據庫。 – xQbert 2013-02-18 21:17:59

+0

謝謝@xQbert的建議。在我的情況下,我需要在連接的服務器之間「單向」同步數據(我知道合併複製可以輕鬆實現,但在這裏我有一個狹隘的網絡管理員= p)。我需要將多個服務器的30個表同步到主服務器(每個服務器幾乎需要兩分鐘的SQL處理)。我會嘗試使用臨時表。謝謝。 – 2013-02-19 12:46:00

回答

4

您可以動態創建SQL語句,然後運行該命令。在這種情況下,在@dml變量中使用help + =操作符創建整個命令動態創建

DECLARE @dml nvarchar(max) = N'' 
SELECT @dml += 'UNION ALL SELECT * FROM ' + QUOTENAME(ss.name) + 
       '.[DBNAME].[dbo].foo ' 
FROM sys.servers ss 
WHERE ss.server_id > 0 

SELECT @dml = STUFF(@dml, 1, 10, '') 
EXEC sp_executesql @dml 
+0

+1比我的while循環更簡單更快 – Andomar 2013-02-19 14:33:58

+0

thx @Andomar聽起來很愉快;) – 2013-02-19 15:01:14

+0

它像一個魅力一樣工作。謝謝@AlexanderFedorenko – 2013-02-21 20:11:17

1

這需要一個動態查詢,如:

declare @servers table (name sysname) 

insert @servers 
     (name) 
select  name 
from    sys.servers 
where   server_id > 0 

declare @query nvarchar(max) = '' 
while 1=1 
    begin 
    declare @server sysname 

    select top 1 @server = name 
    from @servers 

    if @@rowcount = 0 
     break 

    if @query <> '' 
     @query = @query + ' union all ' + char(13) + char(10) 

    set @query = @query + 
     ' select * from ' + quotename(@server) + '.dbname.dbo.foo ' + 
     char(13) + char(10) 

    delete @server 
    where name = @server 
    end 

print @query -- For debugging 
exec (@query) 
+0

謝謝@Andomar的答案。讓我明白(我以前從來沒有用過動態查詢:)),這個查詢是否會返回來自X鏈接服務器的X表「foo」,如: X1.foo X2.foo ... Xn.foo ? – 2013-02-19 12:51:30

0

我已經做了一些工作,我不得不加入由兩個鏈接服務器的結果。其中一個鏈接的服務器是紅磚數據庫,簡而言之,我不得不使用openquery。

我使用的方法是在ms sql中創建臨時表。然後,我將它們從openqueries的結果填充到鏈接的服務器,並使用普通的tsql將它們放在一起。