复杂的SQL Server在多个数据库之间进行查询

时间:2010-10-18 20:44:15

标签: sql-server

我有Scenario,我想将其转换为查询。 我的场景: 我有很多具有相同结构的dbs“Clientxxxx”我想为所有这些dbs做循环以从一个表中获取数据存在于所有这些被称为“EventLog”的dbs中这些事件日志记录在此表中,用于客户端存在于另一个名为“门户网站“

我想让“门户”数据库中的每个客户端都使用其他dbs“Clientxxxx”中的“EventLog”表中的事件日志

db:Client1          db:Client2            db:Client3
table:"EventLog"    table:"EventLog"      table:"EventLog"

each client has his db and his data in Portal db 

db:portal
table:Clients

query:
Client1 data 
his event logs 
client2 data
his event logs 
and so on 
........
........
........
........

我需要一些帮助。

感谢

2 个答案:

答案 0 :(得分:1)

我会做以下事情:

Portal db中创建一个包含此视图的视图:

vw_AggregateClients:

SELECT 'Client1' as clientName, * from Client1.dbo.EventLog
UNION
SELECT 'Client2', * from Client2.dbo.EventLog
UNION
SELECT 'Client3', * from Client3.dbo.EventLog

然后像这样查询:

SELECT * from vw_AggregateClients as ac
INNER JOIN Clients as c
ON ac.clientName = c.ClientName

如果您的客户端数量很大,或者您不知道有多少客户端,那么您可能需要使用dynamic sql。如果你走那条路,那就把文章链接到一个好的阅读。

答案 1 :(得分:0)

通常,我使用动态SQL方法,使用游标遍历所有数据库,插入到统一表变量中,然后从变量中选择:

declare @return (dbname varchar(100),
                <<dataset spec for EventLog>>)

declare @db varchar(100)
declare @sql varchar(max)

declare recscan cursor for
select name from sys.databases
where database_id not in (1,2,3,4) --excludes system databases

open recscan
fetch next from recscan into @db

while @@fetch_status = 0
begin
    set @sql = 'select '''+@db+''',* from '+@db+'..eventlog'

    insert into @return
    exec(@sql)

    fetch next from recscan into @db
end

close recscan
deallocate recscan

select * from @return

请注意,我创建了一个额外的字段,并将数据库名称作为显式字符串值放入动态查询中,以便我可以突破数据的来源。我还对表对象使用3部分命名,但您可以在SQL变量中插入动态构造的USE语句。