计算所有符合条件的表中的行

时间:2019-03-25 10:32:30

标签: sql sql-server tsql

我的数据库有7,000个表,其中大多数都有一列DataAreaId,但不是所有表,因为有些是全局的。

我想列出所有具有列DataAreaId及其行计数的表,其中列DataAreaId包含“ FR”。

对于一张桌子,它应该是:

SELECT COUNT(*)
FROM Table
WHERE DataAreaId = 'FR'

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您可以使用以下

CREATE TABLE T1(
  Dataareaid  VARCHAR(45)
);

CREATE TABLE T2(
  Dataareaid  VARCHAR(45)
);

INSERT INTO T1 VALUES
('FR'),
('ALG'),
('FR');

DECLARE @SQL NVARCHAR(max) = N'';

SELECT @SQL = (
   SELECT CONCAT(
        N'UNION ALL ',
        N'SELECT ''',
        t.name,
        N''' AS TableName, ',
        N'Cnt = (SELECT COUNT(1)',
        ' FROM ',
        QUOTENAME(t.name),
        N' WHERE [Dataareaid] = ''FR'')'
   )
   FROM sys.columns c
   JOIN sys.tables t ON c.object_id = t.object_id
   WHERE c.name = 'Dataareaid'
   FOR XML PATH('')
)
SET @SQL = STUFF(@SQL, 1, 10, N'');

EXEC sp_executesql @SQL;

返回:

+-----------+-----+
| TableName | Cnt |
+-----------+-----+
| T1        |   2 |
| T2        |   0 |
+-----------+-----+

Live Demo

答案 1 :(得分:0)

一种方法是查询包含该列的所有表,并为每个表建立一个查询语句

select 'union all select ' + QUOTENAME(t.name,N'''') + ', count(1) from ' + t.name + ' where Dataareaid = ''FR'''
from sys.columns c
  join sys.tables t ON c.object_id = t.object_id
where c.name = 'Dataareaid'

每行看起来像这样

union all select 'SomeTable', count(1) from SomeTable where Dataareaid = 'FR'

现在只需将所有语句放在一起并删除第一个并集

答案 2 :(得分:-1)

我的答案获取列元数据,循环执行该语句,并将结果发布到表变量:

if object_id('tempdb..#LoopList') is not null
    drop table #LoopList

select 
s.[name] as SchemaName
,t.[name] as TableName
,row_number() over (order by t.[object_id] asc) as RowNumber
into #LoopList
from sys.columns as c
inner join sys.tables as t
    on c.[object_id] = t.[object_id]
inner join sys.schemas as s
    on t.[schema_id] = s.[schema_id]
where c.[name] = 'Dataareaid'

declare 
    @a int = 1
    ,@b int = (select max(RowNumber) from #LoopList)
    ,@c nvarchar(max)
    ,@d nvarchar(max)
    ,@e int


declare @count table (RowCounter int)

declare @resultsTable table (TableName nvarchar(500), RowCounter int)


while @a <= @b

begin

    delete from @count
    set @c = concat ((select quotename(SchemaName) from #LoopList where RowNumber = @a)
                    ,'.'
                    ,(select quotename(TableName) from #LoopList where RowNumber = @a)
                    )

    set @d = concat(N'select count(*) from ' 
                    ,@c
                    ,N' where Dataareaid = ''FR'''
                    )
    insert into @count (
            RowCounter
            )
    exec sp_executesql @d

    set @e = (select top 1 RowCounter from @count)

    insert into @resultsTable (
        TableName
        ,RowCounter
        )
    values (@c,@e)

    set @a += 1;

end

select * from @resultsTable