调用另一个存储过程的存储过程会挂起很长时间

时间:2012-10-20 19:31:47

标签: sql-server loops stored-procedures

我有一个存储过程,我得到了我想要的特定客户。它有20行......

我需要做的是为20个客户调用一个或多个存储过程,然后返回整个结果集。我有以下但它只是挂起并说执行..我想知道我有什么不对......

ALTER PROCEDURE [dbo].[getAllTotals] -- This stored procedure is new
@pDt1 datetime, @pDt2 datetime, @pStore int
AS 
BEGIN
   DECLARE @AccountTbl table (AccountID int );
   DECLARE @TotalTbl table (AccountID int, col1 varchar(100), col2  varchar(100) );

   DECLARE @accountID  int

   --cache all accountid INTO cursor AccountID_cursor
   DECLARE AccountID_cursor CURSOR FOR
       SELECT Storeid   
       FROM tblStore  
       WHERE StoreID = 111 OR storeid = 933

   OPEN AccountID_cursor;

   FETCH NEXT FROM AccountID_cursor INTO @accountID;

   WHILE @@FETCH_STATUS = 0
   BEGIN     
      --insert total amount info to tmp table @TotalTbl
      insert @TotalTbl
         EXEC [dbo].[rptTransactions06192012_royal]
              @pDt1 = @pDt1, @pDt2 = @pDt2, @pStore = @accountID
   END

   --Send temp table results to front end as.
   SELECT * FROM @TotalTbl
END

这有意义吗?

提前感谢!!

安娜

2 个答案:

答案 0 :(得分:2)

你永远不会指示光标抓住下一行。

FETCH NEXT FROM AccountID_cursor INTO @accountID;
WHILE @@FETCH_STATUS = 0

BEGIN

    --insert total amount info to tmp table @TotalTbl

insert @TotalTbl

  EXEC [dbo].[rptTransactions06192012_royal]
    @pDt1 = @pDt1,
    @pDt2 =@pDt2,
    @pStore   = @accountID

FETCH NEXT FROM AccountID_cursor INTO @accountID;

END 

另外,请记住,cursoirs的速度非常慢。

答案 1 :(得分:1)

在任何循环周期中,您需要在每个循环结束时移动到下一个项目,否则它将是无限循环。

对于移动到下一个项目的游标指令是“FETCH NEXT”,您只需要将初始加载行复制到游标循环的末尾,这样一旦完成就抓住下一行。