【问题标题】:Stored procedure calling another stored procedure hangs for a long time调用另一个存储过程的存储过程挂了很长时间
【发布时间】:2012-10-20 19:31:47
【问题描述】:

我有一个存储过程,可以为特定客户获取我想要的东西。它返回 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

这有意义吗?

提前致谢!!

安娜

【问题讨论】:

    标签: sql-server loops stored-procedures


    【解决方案1】:

    您永远不会指示光标抓取下一行。

    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 
    

    另外,请记住,光标速度非常慢。

    【讨论】:

    • 谢谢!我应该看到的!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多