【问题标题】:How to query against multiple linked servers?如何查询多个链接服务器?
【发布时间】:2013-02-03 10:03:00
【问题描述】:

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

有什么想法吗?

提前致谢。

【问题讨论】:

  • 性能会变差。您可能需要考虑在作业/事件上运行的存储过程,该过程使用感兴趣的数据填充临时表。这样,在查询之前就完成了繁重的工作,您现在正在对 1 个数据库而不是多个数据库进行选择。
  • 感谢@xQbert 的建议。在我的场景中,我需要在链接服务器之间“单向”同步数据(我知道合并复制可以轻松做到这一点,但在这里我有一个心胸狭窄的网络管理员 =p )。我需要将大约 30 个表从多台服务器同步到一个主服务器(每台服务器几乎需要两分钟的 sql 处理时间)。我会尝试使用临时表。谢谢。

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


【解决方案1】:

您可以动态创建 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

【讨论】:

  • 它就像一个魅力。谢谢@AlexanderFedorenko
【解决方案2】:

这需要动态查询,例如:

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)

【讨论】:

  • 感谢@Andomar 的回答。让我明白(我之前从未使用过动态查询:)),这个查询是否会从 X 个链接服务器返回 X 个表“foo”,例如:X1.foo X2.foo ... Xn.foo ?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多