sql-server – 所有数据库查询结果的联合,也包括数据库名称

我希望有人可以提供帮助.我有许多服务器,每个服务器上都有多个数据库.所有数据库都有一个我想要查询的表,其中包含一个非常简单的’select count(*)from section’.我希望将结果加上数据库名称全部整理在一起(即不是单独的查询结果,我无法在一次快速点击中复制出来).结果如下:

**DB Name** **Number of Sections**

Name1  10

Name2 20

Name3 11

Name4 9

Name5 20

到目前为止,我有两个问题如下:

这个查询给了我一个完整的查询结果列表,但是它没有给我结果所涉及的数据库名称,我不知道如何添加它.

DECLARE @sql varchar(max);

SELECT @sql = Coalesce(@sql + ' UNION ALL ', '') + 'SELECT count(*) as ''Number of Sections'' FROM ' + QuoteName(name) + '.dbo.section'
FROM   sys.databases
where database_id > 4
;

EXEC (@sql);

这个查询给了我想要的确切结果,但它们都是单独的查询,因此我必须手动复制每个查询以整理结果.

DECLARE @command varchar(1000) 

SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'') BEGIN USE ? SELECT ''?'', COUNT(*) FROM section END' 

EXEC sp_MSforeachdb @command 

如果有人能给我一个关于如何获得我想要的输出的想法,将非常感激.

最佳答案
只需将DBName添加到第一个查询:

DECLARE @sql varchar(max);

SELECT @sql = Coalesce(@sql + ' UNION ALL ', '') + 
        'SELECT '''+name+''' AS DBName, count(*) as ''Number of Sections'' FROM ' + QuoteName(name) + '.dbo.section' + CHAR(13)
FROM   sys.databases
where database_id > 4;

--PRINT @sql
EXEC (@sql);

通常,您希望避免使用sp_msforeachdb.它有一些众所周知的错误.

> https://sqlblog.org/2010/12/29/a-more-reliable-and-more-flexible-sp_msforeachdb

编辑:如果要在多个服务器上运行它,您可以编写一个快速SSIS包,循环通过实例表并将数据收集到中央位置.我对以下3个帖子做了一个演练:

> Using a fixed list and a for each loop that changes a connection manager with expressions.
> Using the package to store data to a central location.
> Touching up the package and expanding it to use an instance table to store the list of servers.

将所有这些结合到这个答案中会有点长,但这里有基础知识:

>在其中一个实例上创建实例表.
>创建一个表来存储要收集的数据(可能是同一个实例).
>在SSIS包中创建一个SQL任务,该任务查询实例表并将结果存储在对象变量中.
>为循环变量的每个循环创建一个.
>在for循环中,将变量更改为等于对象变量中的当前实例名称.
>创建一个连接管理器,该管理器使用表达式将服务器名称属性更改为实例变量的内容.
>在for each循环中创建数据流

>数据流源使用带有表达式的连接管理器.
>将收集数据的查询放入源中.
>将目的地设置为您在步骤2中创建的表格.

转载注明原文:sql-server – 所有数据库查询结果的联合,也包括数据库名称 - 代码日志