我的数据库有7,000个表,其中大多数都有一列DataAreaId
,但不是所有表,因为有些是全局的。
我想列出所有具有列DataAreaId
及其行计数的表,其中列DataAreaId
包含“ FR”。
对于一张桌子,它应该是:
SELECT COUNT(*)
FROM Table
WHERE DataAreaId = 'FR'
有什么建议吗?
答案 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 |
+-----------+-----+
答案 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