Pourquoi ma requête SQL Server 2008 continue-t-elle à s'exécuter?

J'ai une requête dans SQL Server 2008 R2 comme ci-dessous, quand j'exécute cette requête, elle continue à fonctionner … comment déboguer pour savoir ce qui ne va pas avec ce code? toute idée d'aide pls. 🙂

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 

Votre boucle dépend de @runningstock <= 0 pour se terminer. Pourtant, mes tests montrent que @allocateqty est finalement évalué à 0! Cela signifie que "SET @runningstock = @runningstock – @allocateqty" arrête de décrémenter @runningstock. À ce stade, vous êtes dans une boucle infinie. Jeu terminé.

J'ai utilisé la méthode très basse technologie de

  PRINT @runningstock PRINT @allocateqty 

près de la fin de la boucle afin que je puisse regarder ces valeurs.

On dirait que vous voulez casser la boucle quand @runningstock arrive à 0 ou less, à en juger par la combinaison de vos clauses "while" et "break". Essayez d'utiliser "while (@runningstock> 0)", plutôt que "> =" que vous utilisez actuellement.