Sql server 由于使用了游标,查询速度太慢
我正在尝试从存储过程中删除游标Sql server 由于使用了游标,查询速度太慢,sql-server,stored-procedures,cursor,Sql Server,Stored Procedures,Cursor,我正在尝试从存储过程中删除游标 Declare cur_Acc_Map cursor local for Select Group_No from Account_Group Where Company_No in (0,@Company_No) and Group_No <> 14 and Parent_Group_No = @Parent_Id order by Group_Name open cur_Acc_Map fetch n
Declare cur_Acc_Map cursor local for
Select Group_No from Account_Group
Where Company_No in (0,@Company_No) and Group_No <> 14
and Parent_Group_No = @Parent_Id
order by Group_Name
open cur_Acc_Map
fetch next from cur_Acc_Map into @Group_No
while @@fetch_status <> -1
begin
exec SP_Account_Map_Process @Company_No, @UserName, @HostName, @Sequence, @Group_No, @Level_Id,@Acc_year,@From_date,@To_date,@DispMode
fetch next from cur_Acc_Map into @Group_No
End
close cur_Acc_Map
deallocate cur_Acc_Map
在这种情况下如何使用游标
这个查询的执行时间是7秒,这太多了,有时甚至需要更多的时间。如何有效地利用这里的连接,或者我应该一个接一个地手动迭代获取的记录,这会有帮助吗
整个程序如下:
ALTER Procedure [dbo].[SP_Account_Map_Process]
@Company_No int,
@UserName varchar(50),
@HostName varchar(50),
@Sequence int,
@Parent_Id int = 0,
@Level_Id int = 0,
@Acc_year int=0,
@From_date datetime= null,
@To_date datetime =null,
@DispMode int=0
As
Begin
if @Level_Id = 0
Begin
Set @Parent_Id = 0
End
Set @Level_Id = @Level_Id + 1
Declare @Group_No int, @SrNo int
Set @SrNo = isnull((select MAX(Num03) from Rpt_Temp where UserName = @UserName and HostName = @HostName and ReportName = 'ACC_MAP'),0) + 1
print @SrNo
insert into Rpt_Temp (UserName , HostName, ReportName,
Num01 , Num02 , Num03, Num04,Num05, Num06, Num07, Num08,
Str01,Str02 )
select @UserName, @HostName, 'ACC_MAP',
@Company_No, @Sequence, @SrNo, @Level_Id-1, @Parent_Id, Parent_Group_No, 0, 1,
Group_Name,
Case when Account_Group.is_fixed='T' then
LTRIM(RTRIM(cast(@Company_No as varchar(10)) + '.' + Account_Group.Tree_ID))
else
LTRIM(RTRIM(Account_Group.Tree_ID))
end
from Account_Group where Group_No = @Parent_Id
Declare cur_Acc_Map cursor local for
Select Group_No from Account_Group
Where Company_No in (0,@Company_No) and Group_No <> 14
and Parent_Group_No = @Parent_Id
order by Group_Name
open cur_Acc_Map
fetch next from cur_Acc_Map into @Group_No
while @@fetch_status <> -1
begin
exec SP_Account_Map_Process @Company_No, @UserName, @HostName, @Sequence, @Group_No, @Level_Id,@Acc_year,@From_date,@To_date,@DispMode
fetch next from cur_Acc_Map into @Group_No
End
close cur_Acc_Map
deallocate cur_Acc_Map
insert into Rpt_Temp (UserName , HostName, ReportName,
Num01 , Num02 , Num03, Num04,Num05, Num06, Num07, Num08,
Str01,str02)
select @UserName, @HostName, 'ACC_MAP',
@Company_No, @Sequence, @SrNo, @Level_Id, 0, Parent_Group_No, Account_No, 0,
Account_Name,Tree_ID
from Account Where Company_No = @Company_No and Parent_Group_No = @Parent_Id
End
无法执行此操作,因为您正在调用游标内的SP。您可能希望发布SP_Account_Map_进程的内容。也许你可以取消对它的单独调用。这是在它自己内部调用的,我的意思是这是SP_Account_Map_进程我不明白,所以它在调用它自己?作为旁注,请避免在存储的进程前加上sp_3;前缀。阅读本文了解更多信息:我更新了问题,发布了完整的程序请查看@wewesthemenace。此过程已由以前的其他员工创建,因此我无法更改命名约定