4

いくつかの SQL Server 2008 サーバー/インスタンスをリンクした後、これらのサーバーに対してより一般的なクエリを実行したいと考えています。クエリの運命を次のように指定する必要があることはわかっています。

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

ただし、このクエリを複数のリンク サーバーに対して実行します。SRV\INSTANCEまた、この select ステートメントが必要なものを正確に返すことも知っています。

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 ステートメントを動的に作成し、そのコマンドを実行できます。このシナリオでは、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
于 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

2 つのリンクされたサーバーからの結果を結合する必要があるいくつかの作業を行いました。リンクされたサーバーの 1 つは redbrick データベースに接続されており、簡単に言うと、openquery を使用する必要がありました。

私が使用したアプローチは、ms sql で一時テーブルを作成することでした。次に、openqueries からリンク サーバーへの結果を入力し、通常の tsql を使用してすべてをまとめました。

于 2013-02-18T21:21:10.157 に答える