如何查询多个链接服务器?

时间:2013-02-18 21:11:44

标签: sql sql-server-2008 linked-server multiserver

在链接一些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

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

您可以动态动态创建SQL语句,然后运行该命令。在带有help + =运算符的@dml变量的这种情况下,动态创建整个命令

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

答案 1 :(得分: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)

答案 2 :(得分:0)

我做了一些工作,我不得不加入两个链接服务器的结果。其中一个链接服务器是一个redbrick数据库,长话短说,我不得不使用openquery。

我使用的方法是在ms sql中创建临时表。然后我用openqueries中的结果填充它们到链接服务器,并使用普通的tsql将它们放在一起。