我有多个数据库具有相同的结构,其名称就像“Client1234”在“客户端”旁边的数字不同我在每个数据库中都有一个名为“Transactions”的表,我想运行查询来统计所有“事务”表中的所有原始数据数据库。
当我选择数据库时,我需要检查它是否有客户端字,并且它旁边有数字。
我有多个数据库具有相同的结构,其名称就像“Client1234”在“客户端”旁边的数字不同我在每个数据库中都有一个名为“Transactions”的表,我想运行查询来统计所有“事务”表中的所有原始数据数据库。
当我选择数据库时,我需要检查它是否有客户端字,并且它旁边有数字。
尝试使用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
您可以使用动态SQL来创建这些查询:
select 'select count(*) from ' + name + '.dbo.transactions'
from master..sysdatabases
where name like 'Client%'
and isnumeric(substring(name,6,1))
这将返回一个结果集,每行都是一个SQL查询,用于计算特定数据库。它可以被编程语言使用,用作游标等。如果你提供更多细节,我可以提供一个更好的例子。
使用Fosco的方法时,最好放入括号 []
围绕数据库名称:
SELECT 'SELECT count(*) FROM ' + '[' + name + ']' + '.dbo.transactions'
FROM master..sysdatabases
WHERE name like 'Client%' and isnumeric(substring(name,6,1))
如果事先不知道您要查询的数据库的名称和编号,则只能使用动态查询来执行此操作。你需要生成一个类似的脚本
SELECT COUNT(*) FROM Client1.dbo.Transactions
SELECT COUNT(*) FROM Client2.dbo.Transactions
...
当然,您需要为每个数据库拥有适当的权限。