我是SQL的新手,我编写了一个存储过程,但无法让它做我想做的事。
在存储过程中,我有一个while循环运行并且没有抛出任何豁免,除了我要在表的每一行中更新的行都没有更新,即使它正在执行查询的内部while循环中的if语句。
如果有人能向我解释这里出了什么问题,我将非常感激。
存储过程返回表,但CommmissionRateID
列未更改。
我附加了一个导致问题的IF..ELSE语句
IF (@SalePrice * 100) / @ListPrice > 50
BEGIN
SET @CommisionRateID = 3;
SELECT * FROM CarDetails
UPDATE CarDetails
SET CommissionRateID = @CommisionRateID
FROM CarDetails
WHERE CarID = (@i + 1)
END
谢谢,
答案 0 :(得分:2)
首先,您没有声明变量,您实际上正在声明您正在使用的参数,如变量。
除了@CommisionRateID
之外,每个参数都会在原始值被使用之前覆盖任何原始值。除非您需要将值传递给SP并使用它,否则您应该将其从参数列表并在proc的主体中声明它。
关于@CommisionRateID
,您永远不会更改原始值,而是用于确定您是否执行任何操作。因此,我猜测您正在尝试将其用作标准,以便您只更新当前值为NULL的记录。在这种情况下,您不需要此参数
假设您要根据SalePrice& amp;来设置汽车的佣金率。 ListPrice,目前没有佣金率,我认为您的所有代码都可以替换为以下内容:
CREATE PROC spAssignCommissionRate
AS
BEGIN
UPDATE CarDetails
SET CommissionRateID = CASE WHEN (SalePrice * 100) / ListPrice > 50 THEN 3
WHEN (SalePrice * 100) / ListPrice > 30 THEN 2
ELSE 1
END
WHERE CommissionRateID IS NULL
END
编辑:如果有人想知道我是如何从OPs代码中推断出这一切的话,我实际上并不是通灵的。请查看帖子的原始版本。