Sql 如何检查某些表是否为空?

Sql 如何检查某些表是否为空?,sql,sql-server,Sql,Sql Server,如何在一次查询中检查某些数据表(例如“tableA”、“tableB”和“tableC”)是否为空(SQL Server) 预期结果: 对我来说最重要的是有一个结果 它可以是true(如果所有表都为空)或false 另一种可能性是所有表上所有项的总和,如0(如果所有表都为空)或n 示例 数据库中有三个表:表1、表2和表3 所有的桌子都是空的。-->预期结果:0 表1有3行,表2有0行,表3有1行。-->预期结果:4 您可以使用union all从表中获取计数: select 'a', cou

如何在一次查询中检查某些数据表(例如“tableA”、“tableB”和“tableC”)是否为空(SQL Server)

预期结果: 对我来说最重要的是有一个结果

  • 它可以是true(如果所有表都为空)或false
  • 另一种可能性是所有表上所有项的总和,如0(如果所有表都为空)或n
示例

数据库中有三个表:表1、表2和表3

  • 所有的桌子都是空的。-->预期结果:0
  • 表1有3行,表2有0行,表3有1行。-->预期结果:4

  • 您可以使用
    union all
    从表中获取计数:

    select 'a', count(*) from a union all
    select 'b', count(*) from b union all
    select 'c', count(*) from c;
    
    但是,最快的方法是使用
    exists

    select (case when not exists (select 1 from a) then 1 else 0 end) as a_is_empty,
           (case when not exists (select 1 from b) then 1 else 0 end) as b_is_empty,
           (case when not exists (select 1 from c) then 1 else 0 end) as c_is_empty
    
    编辑:

    如果需要三个表中的总行数,只需将它们相加:

    select sum(cnt)
    from (select 'a', count(*) as cnt from a union all
          select 'b', count(*) from b union all
          select 'c', count(*) from c
         ) abc;
    

    如果您需要准确、最新的结果,我会小心使用系统表进行此操作。系统表在静态环境中非常好,在静态环境中,表不会发生变化,但我怀疑您的环境更具动态性。

    您也可以使用此DMV,它将仅从缓存中查询计数

    SELECT  SUM(row_count) AS rows
    FROM sys.dm_db_partition_stats
    where object_name(object_id) in ('table1','tab1e2')
    group by OBJECT_NAME(object_id)
    
    根据问题更新:

    ;with cte
    as
    (SELECT  SUM(row_count) AS rows
            FROM sys.dm_db_partition_stats
            where object_name(object_id) in ('table1','tab1e2')
            group by OBJECT_NAME(object_id))
    select sum(rows) as rows from cte
    

    希望下面的查询能帮助你

    SELECT
            SCHEMA_NAME(SOS.SCHEMA_ID) + '.' + (SOS.NAME) AS [Table Name]
          , (SPS.Rows) AS [Row Count]
          , [Heap / Clustered Table] = CASE SPS.INDEX_ID WHEN 0 THEN 'HEAP' ELSE 'CLUSTERED' END
    FROM 
          sys.objects AS SOS
          INNER JOIN sys.partitions AS SPS
                ON SOS.object_id = SPS.object_id
    WHERE
          SOS.type = 'U'
          AND SPS.index_id < 2
          and SPS.Rows =0
    ORDER BY [Table Name]
    
    选择
    模式名称(SOS.SCHEMA_ID)+'.+(SOS.NAME)为[表名]
    ,(SPS.行)作为[行计数]
    ,[Heap/Clustered Table]=案例SPS.INDEX_ID,当0之后为'Heap'或'Clustered'结束时
    从…起
    系统对象作为SOS
    内部将sys.partitions连接为SP
    在SOS.object\u id=SPS.object\u id上
    哪里
    SOS.type='U'
    和SPS.index_id<2
    和SPS.Rows=0
    按[表格名称]排序
    
    如果我的帖子对你有帮助,请记下我的答案。 当做
    ChetanV

    请编辑您的问题并显示您想要的结果。使用
    @psur>中选择前1名可能会更快。那应该没什么区别。
    存在
    应该在第一条记录时自动停止。@GordonLinoff:这不是我需要的。请参阅我编辑的问题-我描述了预期结果。非常感谢。这一次几乎是预期的结果。最后,我希望得到“行”列的总和。不完全是。。。这个函数返回与表一样多的行,表示每个表有多少行。我希望将所有表的总和显示在一行结果中。请使用一些示例数据和预期结果更新您的问题。好的,我刚刚添加了一个详细的示例。非常感谢。