SQL Server:如何计算来自多个数据库的行并在1个表

时间:2017-04-19 14:42:04

标签: sql-server

我有几个数据库,我想要一个列表,其中包含每个数据库的行数,如下所示:

  1. DB1 195,344
  2. DB2 134,615
  3. DB3 174,098
  4. 如果我使用下面的代码,我得到输出,虽然我收到了几个单独的单元格中的输出。我无法复制此输出。有没有一种方法可以在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.
    

3 个答案:

答案 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
  '

你也可以在这里使用更好的版本: