0

我正在尝试将 ColdFusion 查询转换为存储过程。我原来的查询如下

UPDATE Products
SET Active = 1,
    Pounds = #lbs#,
    Ounces = #ozs#,
    Qty = #Qty#,
    PrevQty = #GetItem.Qty#,
    PrevWMQty = #GetItem.Qty#,
    PrevGoogleQty = #GetItem.Qty#,
    <cfif Cost NEQ GetItem.OurCost>
        PrevOurCost = #GetItem.OurCost#,
    </cfif>
    OurCost = #Cost#
WHERE ItemID = '#fixedItemID#'

如您所见,我的查询中有 IF 语句,因此如果满足某些条件,它将更新这些字段。如果不满足这些条件,则不会将它们包含在更新中。

所以我想要这样的东西,但我不确定这在存储过程中是否可行

CREATE PROCEDURE [dbo].[spUpdateQty] 
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE Products
    SET Active = 1,
        Pounds = @var1,
        Ounces = @var2,
        Qty = @var3,
        PrevQty = @var4,
        PrevWMQty = @var5,
        PrevGoogleQty = @var6,
        IF (@var7 >= @var8)
        BEGIN
            PrevOurCost = @var7,
        END
        OurCost = @var8
    WHERE ItemID = @var9
END

我基本上希望传入可选参数,并根据它们的值更新该字段或不更新该字段。我讨厌必须为每种可能性为每个 IF 语句编写单独的单独查询。那么这甚至可能吗,或者我是否以错误的方式解决这个问题?

4

2 回答 2

2

您可以使用 case 表达式有条件地更新列,从而避免重复更新语句。

例如

UPDATE Products SET
    Active = 1,
    Pounds = @var1,
    Ounces = @var2,
    Qty = @var3,
    PrevQty = @var4,
    PrevWMQty = @var5,
    PrevGoogleQty = @var6,
    PrevOurCost = case when @var7 >= @var8 then @var7 else PrevOurCost end,
    OurCost = @var8
WHERE ItemID = @var9
于 2019-12-11T00:16:50.800 回答
1

有不止一种方法可以做到这一点

您可以使用案例陈述

      UPDATE Products
      SET Active = 1,
          Pounds = @var1,
          Ounces = @var2,
          Qty = @var3,
          PrevQty = @var4,
          PrevWMQty = @var5,
          PrevGoogleQty = @var6,
          PrevOurCost = CASE WHEN @var7 >= @var8 THEN @var7 ELSE PrevOurCost END,
          OurCost = @var8
        WHERE ItemID = @var9

或者您可以在 UPDATE 语句之外使用 IF 语句

IF (@var7 >= @var8)
BEGIN

      UPDATE Products
      SET Active = 1,
          Pounds = @var1,
          Ounces = @var2,
          Qty = @var3,
          PrevQty = @var4,
          PrevWMQty = @var5,
          PrevGoogleQty = @var6,
          PrevOurCost = @var7,
          OurCost = @var8
        WHERE ItemID = @var9
END
ELSE
BEGIN
      UPDATE Products
      SET Active = 1,
          Pounds = @var1,
          Ounces = @var2,
          Qty = @var3,
          PrevQty = @var4,
          PrevWMQty = @var5,
          PrevGoogleQty = @var6,
          OurCost = @var8
        WHERE ItemID = @var9

END
于 2019-12-11T01:12:25.640 回答