代码之家  ›  专栏  ›  技术社区  ›  Kieran

SQL Server更新:如果参数不为空,则设置列[重复]

  •  1
  • Kieran  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一个存储过程,它打算根据列是否存在值来插入或更新表。除了我只想在传递了参数的情况下设置某些列的值外,这一切都可以正常工作。这是因为我不想用空值覆盖现有的列值。

    下面是存储过程的概念:

    CREATE PROCEDURE [dbo].[p_SaveState]
       @Foo             nvarchar(50),
       @Bar             nvarchar(20) = null,
       @Something       nvarchar(20) = null
    AS
    BEGIN
       IF EXISTS (SELECT TOP(1) Foo FROM dbo.[State] WHERE Bar = @Bar)
       BEGIN
           UPDATE [dbo].[State]
           SET Bar = @Bar, 
               Something = @Something
           WHERE (--condition--)
       END
       ELSE
       BEGIN
          ... -- INSERT statement goes here
    

    我正试图完成这样的事情:

    UPDATE [dbo].[State]
    SET Bar = @Bar, 
        IF (@Something IS NOT NULL) Something = @Something
     WHERE (--condition--)
    

    但我不相信我可以使用case,因为我没有原始值可以设置,而不执行select。

    我怎样才能达到这种效果?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Larnu    6 年前

    ISNULL 在这里工作很好:

    UPDATE [dbo].[State]
    SET Bar = @Bar, 
        Something = ISNULL(@Something,Something)
    WHERE...
    
        2
  •  3
  •   claud.io    6 年前

    COALESCE 会为你做的!

    UPDATE [dbo].[State]
    SET Bar = @Bar, 
        Something = COALESCE(@Something,Something)
    WHERE (--condition--)
    
        3
  •  1
  •   Diado Jasim Juwel    6 年前

    能够 使用 CASE 像这样…

    UPDATE [dbo].[State]
    SET Bar = @Bar, 
        Something = CASE WHEN @Something IS NOT NULL THEN @Something ELSE Something END
    WHERE (--condition--)
    

    这将设置 Something 如果它是 NOT NULL ,但如果是,将使用原始值 NULL .

    同样的方法也可以用得更简洁 ISNULL 尽管如此:

    UPDATE [dbo].[State]
    SET Bar = @Bar, 
        Something = ISNULL(@Something, Something)
    WHERE (--condition--)