2010-09-07 37 views
11

我有多个数据库具有相同的结构它的名称像“Client1234”不同的数字旁边“客户端”我有每个数据库内的表称为“交易”,我想运行查询在所有数据库的“交易”表中计算所有原始数。查询多个数据库(SQL服务器)

此外,当我选择数据库,我需要检查它有客户端的单词,它有数字旁边的单词。

+0

要动态(不指定每个数据库)查询所有数据库? – Fosco 2010-09-07 13:27:11

+0

是的,我需要在所有数据库上运行一个查询。 – 2010-09-07 13:33:30

回答

12

尝试使用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 
0

如果您希望查询的数据库的名称和数量事先未知,那么您只能通过使用动态查询来完成此操作。您需要生成一个脚本,如

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

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

1

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

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

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

+0

如果其中一些数据库没有这个事务处理表,该怎么办? – 2010-09-07 13:44:48

+0

是的,请提供更多详情。 – 2010-09-07 14:26:57

1

当使用Fosco的方法,这是一个好主意,把括号[]围绕数据库名称:

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