4

链接一些 SQL Server 2008 服务器/实例后,我想对这些服务器进行更通用的查询。我知道我必须像这样指定查询的命运:

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

但是,我会针对多个链接服务器运行此查询。我也知道这个选择语句完全返回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

有任何想法吗?

提前致谢。

4

3 回答 3

6

您可以动态创建 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
于 2013-02-18T22:06:56.533 回答
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)
于 2013-02-18T21:17:37.570 回答
0

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

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

于 2013-02-18T21:21:10.157 回答