2015-05-12 33 views
3

我在SQL Server 2008 R2中有一个查询,如下所示,当我执行这个查询时,它一直在运行......如何调试以找出这段代码出了什么问题?任何帮助想法请。 :)为什么我的SQL Server 2008查询继续运行?

DECLARE @RESULT TABLE (
    priority int, 
    partcode nvarchar(50), 
    orderqty int, 
    allocateqty int) 
DECLARE @ORDER TABLE(
    priority int, 
    partcode nvarchar(50), 
    orderqty int) 
DECLARE @STOCK TABLE(
    partcode nvarchar(50), 
    stockqty int) 

INSERT INTO @ORDER (priority,partcode,orderqty) 
VALUES(1,'A',10),  
     (2,'A',40); 
INSERT INTO @STOCK(partcode,stockqty) 
VALUES('A',22); 

IF (SELECT SUM(orderqty)FROM @ORDER)<(SELECT stockqty FROM @STOCK) 
BEGIN 
INSERT INTO @RESULT(priority,partcode,orderqty,allocateqty) 
SELECT priority, partcode,orderqty,orderqty 
FROM @ORDER 
END 
ELSE 
BEGIN 
DECLARE @allocatedqty int = 0 
DECLARE @allocateqty int = 1 
DECLARE @runningstock int = (SELECT stockqty FROM @stock) 
WHILE @runningstock>=0 
BEGIN 
    DECLARE @priority int 
    SELECT TOP 1 @priority = priority FROM @order ORDER BY priority ASC 
    WHILE @priority <= (SELECT MAX(priority) FROM @order) 
    BEGIN 
     DECLARE @orderqty int 
     SELECT @orderqty = orderqty - @allocatedqty FROM @order WHERE priority = @priority 
     SELECT @allocateqty = CASE WHEN @runningstock > 0 AND @orderqty > 0 THEN @allocateqty ELSE 0 END 
     INSERT INTO @RESULT(priority,partcode,orderqty,allocateqty) 
     SELECT @priority, 
       partcode, 
       CASE WHEN @orderqty >= 0 THEN @orderqty ELSE 0 END AS orderqty, 
       @allocateqty 
     FROM @order 
     WHERE priority = @priority 
     SET @priority += 1  
     SET @runningstock = @runningstock - @allocateqty 
    END 
    SET @allocatedqty += @allocateqty 
    IF (@runningstock <= 0) BREAK 
END 
END; 
SELECT priority,partcode,SUM(allocateqty) AS [allocateqty] 
FROM @Result 
GROUP BY priority,partcode 
+0

尝试'@priority'='@priority'+ 1在你的while块的末尾(不含引号),不知道这是否是问题,但这是我如何写增量,我从来没有任何问题到目前为止 –

+0

@Jeremy C.我试过了,但没有帮助。如果我在这种情况下设置股票= 20,它运行平稳。 – Sokea

+0

您需要检查@runningstock的值,该值确定正在完成的循环的数量,如果它是一个大数字,那么将查询长时间运行非常合理。您可能需要优化查询。否则,你可以确定某处存在死锁。 –

回答

5

您的循环取决于@runningstock < = 0终止。然而,我的测试显示@allocateqty最终评估为0!这意味着“SET @runningstock = @runningstock - @allocateqty”会停止递减@runningstock。那时你处于一个无限循环。游戏结束。

我用的

PRINT @runningstock 
    PRINT @allocateqty 

非常低的高科技手段附近的循环结束,所以我能看到这些值。

0

它看起来像@runningstock从0或更小时开始打破循环,根据“while”和“break”子句的组合来判断。尝试使用“while(@runningstock> 0)”,而不是您目前使用的“> =”。