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。此过程已由以前的其他员工创建,因此我无法更改命名约定