我有多个数据库具有相同的结构它的名称像“Client1234”不同的数字旁边“客户端”我有每个数据库内的表称为“交易”,我想运行查询在所有数据库的“交易”表中计算所有原始数。查询多个数据库(SQL服务器)
此外,当我选择数据库,我需要检查它有客户端的单词,它有数字旁边的单词。
我有多个数据库具有相同的结构它的名称像“Client1234”不同的数字旁边“客户端”我有每个数据库内的表称为“交易”,我想运行查询在所有数据库的“交易”表中计算所有原始数。查询多个数据库(SQL服务器)
此外,当我选择数据库,我需要检查它有客户端的单词,它有数字旁边的单词。
尝试使用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
如果您希望查询的数据库的名称和数量事先未知,那么您只能通过使用动态查询来完成此操作。您需要生成一个脚本,如
SELECT COUNT(*) FROM Client1.dbo.Transactions
SELECT COUNT(*) FROM Client2.dbo.Transactions
...
当然,您需要为每个数据库设置适当的权限。
您可以使用动态SQL创建这些查询:
select 'select count(*) from ' + name + '.dbo.transactions'
from master..sysdatabases
where name like 'Client%'
and isnumeric(substring(name,6,1))
这将返回,每行是一个SQL查询的结果集统计特定的数据库。它可以被编程语言使用,用作游标等。如果你提供更多的细节,我可能会提供一个更好的例子。
如果其中一些数据库没有这个事务处理表,该怎么办? – 2010-09-07 13:44:48
是的,请提供更多详情。 – 2010-09-07 14:26:57
当使用Fosco的方法,这是一个好主意,把括号[]
围绕数据库名称:
SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions'
FROM master..sysdatabases
WHERE name like 'Client%' and isnumeric(substring(name,6,1))
要动态(不指定每个数据库)查询所有数据库? – Fosco 2010-09-07 13:27:11
是的,我需要在所有数据库上运行一个查询。 – 2010-09-07 13:33:30