用存储过程写递归。为什么效率那么低,求优化,大概7000条数据 在普通电脑上 运算了1分25秒
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- 调用
/*
declare @retStr varchar(max)
set @retStr=''
exec Zation_Str '009',@retStr output
select @retStr
*/
ALTER PROCEDURE [dbo].[Zation_Str]
@actid varchar(60),
@retStr varchar(max) output
as
begin
declare @MaxNum bigint,@NowNum bigint, @sactid varchar(60),@inNum bigint
set @MaxNum=0
set @NowNum = 1
set @inNum=0
select @MaxNum =count(1)
from so_zation
where state>0 and fatherid=@actid
while @NowNum<=@MaxNum
begin
select @sactid=actid,@retStr=@retStr+'<tr><td>'+actid+actname+fatherid+'</td></tr>' from (select actid,actname,fatherid,(row_number() over(order by actid asc))as num
from so_zation
where state>0 and fatherid=@actid ) as next where num=@NowNum
select @inNum =count(1)
from so_zation
where state>0 and fatherid=@sactid
if @inNum >0
begin
exec Zation_Str @sactid,@retStr output
end
set @NowNum=@NowNum+1
end
end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
在这里面拼接好直接在页面展示 这样多块、
回复
现在已经不是凭快的年代了,硬件基本不是问题,关键的是维护,你写到存储过程里面,别人来维护你的代码,程序的部分不会想到在存储过程里面。效率不是一个程序的第一位,第一位是可维护性和可扩展性
在存储过程里面一般是写表直接的一些业务关系,拼接html建议你写在应用程序里面,这样比较好一点。至于速度为什么慢,也许和‘+’ 有一定的关系。但是不排除数据检索做了重复的工作
我想直接拼接TR TD 生成个HTML的 Table
谢谢啦。自己没注意到。。悲催
问题在于你在循环内部,每一次都要做SELECT。也就是你SELECT执行了7000次。
改造为采用表变量后循环,或者使用游标循环,可以提升很大的效率。