用基于集合的查询替换游标
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
我想找到 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