我有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
........
........
........
........
我需要一些帮助。
感谢
答案 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语句。