问题 查询多个数据库(SQL服务器)


我有多个数据库具有相同的结构,其名称就像“Client1234”在“客户端”旁边的数字不同我在每个数据库中都有一个名为“Transactions”的表,我想运行查询来统计所有“事务”表中的所有原始数据数据库。

当我选择数据库时,我需要检查它是否有客户端字,并且它旁边有数字。


6604
2017-09-07 13:22


起源

您想动态(不指定每个数据库)查询所有数据库吗? - Fosco
是的我需要在所有数据库上运行一个查询。 - Amr Elnashar


答案:


尝试使用sp_msforeachdb存储过程,如下所示:

create table #temp ([rows] int, [client] varchar(100))
exec sp_msforeachdb '
if ''?'' like ''Client%'' and exists(select * from ?.sys.tables t where t.name = ''Transactions'')
begin
insert into #temp select count(*), ''?'' from ?..Transactions
end
'
select * from #temp 
drop table #temp

12
2017-09-07 13:37





您可以使用动态SQL来创建这些查询:

select 'select count(*) from ' + name + '.dbo.transactions'
from master..sysdatabases
where name like 'Client%'
 and isnumeric(substring(name,6,1))

这将返回一个结果集,每行都是一个SQL查询,用于计算特定数据库。它可以被编程语言使用,用作游标等。如果你提供更多细节,我可以提供一个更好的例子。


1
2017-09-07 13:39



如果其中一些数据库没有此Transactions表怎么办? - Denis Valeev
是的,请提供更多详情。 - Amr Elnashar


使用Fosco的方法时,最好放入括号 [] 围绕数据库名称:

SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions'   
FROM master..sysdatabases  
WHERE name like 'Client%'  and isnumeric(substring(name,6,1)) 

1
2018-01-03 17:59





如果事先不知道您要查询的数据库的名称和编号,则只能使用动态查询来执行此操作。你需要生成一个类似的脚本

SELECT COUNT(*) FROM Client1.dbo.Transactions
SELECT COUNT(*) FROM Client2.dbo.Transactions
...

当然,您需要为每个数据库拥有适当的权限。


0
2017-09-07 13:28