在链接一些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 :(得分: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将它们放在一起。