用基于集合的查询替换游标

Replacing cursor with set based query

我想找到 table 组的计数。 table 名称是另一个 table.

中的值

--喜欢

      select count(*) from tablename

--table名称取自

      select tablename from table1

--table1 有大约 171 个 table名字

我正在使用光标获取每个 table 名称和每个 select 计数,但这需要时间。你能帮忙如何用基于集合的解决方案替换游标代码吗? 下面是我的光标代码

SET NOCOUNT ON;

if( OBJECT_ID('tempdb..#temptablenew') IS NOT NULL )
BEGIN
DROP table #temptablenew
END

select * into #temptablenew from table1

declare @srccount int
declare @tablename nvarchar(max);

declare @q2 nvarchar(max);

declare  @id int;

declare my_cursor cursor
local static read_only forward_only

for 

select id,tablename from #temptablenew 

open my_cursor
fetch next from my_cursor
into @id,@tablename
while @@fetch_status = 0
begin 



  set @q2 =N'select @srccount= count(*) from '+@tablename+' with (nolock)';

  execute sp_executesql @q2,@PARAMS = N'@srccount INT OUTPUT', 
      @srccount = @srccount OUTPUT

  select  @srccount,@id,@tablename

  fetch next from my_cursor
  into @id,@tablename
  end
  close my_cursor;
  deallocate my_cursor;

提前致谢

试试这个,

SET NOCOUNT ON;

declare @q2 nvarchar(max) = '';

SELECT @q2 = @q2 + 'SELECT COUNT(*) AS cnt, ''' + tablename  + ''' AS TableName FROM ' + tablename  + ' (NOLOCK); '  
FROM table1

--Print @q2
execute sp_executesql @q2