我有几个数据库,我想要一个列表,其中包含每个数据库的行数,如下所示:
如果我使用下面的代码,我得到输出,虽然我收到了几个单独的单元格中的输出。我无法复制此输出。有没有一种方法可以在1个表中获得输出?我不想使用命令UNION,因为我在数据库之间存在整理冲突。谢谢!
select count (*)
FROM [2014-Apples-Part1].[dbo].[AppleData]
select count (*)
FROM [2014-Apples-Part2].[dbo].[AppleData]
select count (*)
FROM [2014-Apples-Part3].[dbo].[AppleData]
etc.
答案 0 :(得分:1)
sp_msforeachdb 'USE [?];SELECT ''?'', COUNT(*) FROM [dbo].[AppleData]'
结果如下:
DB1 | 195344
DB2 | 134615
DB3 | 174098
唯一的先决条件是所有数据库(甚至系统数据库)上都存在AppleData
表,否则会产生错误。
即使有错误,输出仍然会出现
如果表存在于当前数据库中,您可以在执行select之前进行检查以避免它
或者只是过滤数据库ID,如下例所示:
sp_msforeachdb 'USE [?];if db_id()>4 SELECT ''?'', COUNT(*) FROM [dbo].[AppleData];'
如果达到一定数量的COUNT
,您也可以过滤结果sp_msforeachdb 'USE [?];
if db_id()>4
SELECT ''?'', COUNT(*)
FROM [dbo].[AppleData]
HAVING COUNT(*) >= 1000;'
如果某个值下没有ID,您也可以过滤结果
sp_msforeachdb 'USE [?];
if db_id()>4
SELECT ''?'', COUNT(*)
FROM [dbo].[AppleData]
HAVING MIN(ID) >= 1000;'
最后,我认为您期望的结果将由此请求
提供sp_msforeachdb 'USE [?];
if ''?'' LIKE ''____-Apples-Part_''
SELECT ''?'', COUNT(*)
FROM [dbo].[AppleData]
HAVING MIN(ID) >= 1000;'
答案 1 :(得分:0)
您可以在select语句中指定collate
属性。这应该处理数据库之间的任何不一致,并允许您使用union
。
select 'DB1' collate SQL_Latin1_General_CP1_CI_AS, count(*)
FROM [2014-Apples-Part1].[dbo].[AppleData]
union all
select 'DB2' collate SQL_Latin1_General_CP1_CI_AS, count(*)
FROM [2014-Apples-Part2].[dbo].[AppleData]
union all
select 'DB3' collate SQL_Latin1_General_CP1_CI_AS, count(*)
FROM [2014-Apples-Part3].[dbo].[AppleData]
答案 2 :(得分:0)
首先在一个db中创建一个表来保存计数,然后你可以使用下面的命令
EXECUTE master.sys.sp_MSforeachdb
'USE [?];
insert into commondb.dbo.table
select count(*) from [dbo].[AppleData] '
上面的命令为每个db运行,你可以忽略下面的系统数据库
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
if (db_id()>4 )
begin
yourquery
end
'
你也可以在这里使用更好的版本: