如何在存储过程中更新While循环内的行

时间:2014-04-11 00:46:18

标签: sql sql-server stored-procedures

我是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

谢谢,

1 个答案:

答案 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代码中推断出这一切的话,我实际上并不是通灵的。请查看帖子的原始版本。