2010-09-15 41 views
2

我一直在试图找出每个表中被禁用的行的总数。 在我的数据库中,我有20列IsActive列的表。查询根据列名查找表的行数?

我曾尝试下面的光标,但它越来越错误说无效的对象名称@Namee。

Create table #t 
(
NoOfRows bigint, 
) 

Declare @Namee Varchar(500) 
Declare @GetName Cursor 
Set  @Getname = Cursor for 
Select table_name from information_Schema.columns 
where column_name='isactive'Open @Getname 
Fetch Next From @Getname into @Namee 
While @@Fetch_Status=0 
Begin 
insert into #t Select count(*) from @Namee where isactive=0 
Fetch Next From @Getname into @Namee 
End 
Close @GetName 
Deallocate @GetName 
select * from #t 

回答

0

更换

insert into #t Select count(*) from @Namee where isactive=0 

exec ('insert into #t Select count(*) from ' + @Namee + ' where isactive=0') 
+0

感谢百万Preet的工作。 – Simhadri 2010-09-15 21:57:18

0

根据你的示例查询,这应该工作。这也将是比使用光标

select 
    OBJECT_NAME(c.object_id) as table_name 
, p.row_count 
from sys.columns c 
join sys.dm_db_partition_stats p 
    on c.object_id = p.object_id 
    and p.index_id < 2 
where c.name = 'IsActive' 
+1

这只会返回每个这样的表的rowcount。但他需要一个过滤结果。 – 2010-09-15 21:35:35

+0

你是对的。我误解了这个问题。你的答案是我想要的。 – 2010-09-15 21:39:38

2

尝试快得多这样的:

exec sp_msforeachtable ' 
if exists(
select * from sys.tables as t 
join sys.columns as c on t.object_id = c.object_id 
where t.name = ''?'' and c.name = ''IsActive'') 

select count(*) 
from [?] 
where isactive=0' 
1

虽然我没有测试过,我会选择Mike或Denis的swer。

然而,这里的问题是线路:

insert into #t Select count(*) from @Namee where isactive=0 

您使用@Namee就像它是一个表,但它确实是一个表名的字符串。你将不得不动态地建立SQL,然后执行它:

exec 'insert into #t select count(*) from ' + @Namee + ' where isactive=0'