首页 > 解决方案 > 执行存储过程时,过程内部的循环无限运行

问题描述

USE CIS111_BookStoreMC
GO

IF OBJECT_ID('spAssetInfo') IS NOT NULL
    DROP PROC spAssetInfo 
GO

CREATE PROC spAssetInfo

AS

SELECT AssetID, Description, Cost, PurchaseDate 
INTO #temptable
FROM Assets

ALTER TABLE #temptable ADD CompleteDepreciationYear DATE

DECLARE @value MONEY;
SET @value = 0.00;
DECLARE @j INT;
DECLARE @depreciationNum INT;
SET @j = 1;
WHILE (@j <= 14)
    BEGIN
        SET @depreciationNum = 0;
        SET @value = (select Cost From Assets Where AssetID = @j);
        SET @j = @j + 1;
        WHILE(@value > 0)
            BEGIN  
                SET @value = @value - (@value * 0.2);
                SET @depreciationNum = @depreciationNum + 1;
            END
        INSERT INTO #temptable
            (CompleteDepreciationYear)
        VALUES
            (DATEADD(year, @depreciationNum, CAST((select PurchaseDate From Assets Where AssetID = @j-1) AS DATE)))
    END

SELECT * FROM #temptable

我已经尝试了好几个小时,基本上我试图显示带有 PurchaseDate 的资产库存和项目完全折旧的日期,资产每年折旧 20%。我尝试创建一个临时表并将一些资产表列复制到其中,然后为资产完全折旧的日期添加一列。

出于某种原因,当我尝试执行诸如“EXEC spAssetInfo”之类的过程时,查询将永远运行

我忘记将它包含在屏幕截图中,但我也有 SELECT * FROM #temptable 在执行过程时显示表格

标签: sqlsql-serverstored-procedures

解决方案


问题是这部分: 在此处输入图像描述

做一个跟踪,你会发现这两个条件是无限的(第一个永远不会是假的,第二个永远不会是真的)。

Money=5
Money=5*0,2 = 1
Money=1*0,2 = 0,2
Money=0,2*0,2 = 0,04 and then you have a loop ;)

推荐阅读