SQL Server UPDATE:如果参数不为null,则设置列

时间:2019-01-04 14:29:33

标签: sql-server tsql sql-update

我有一个存储过程,用于根据表是否存在某个列的值来插入或更新表。除了我只想在已传递参数的情况下设置某些列的值之外,此方法工作正常。这是因为我不想用null覆盖现有的列值。

下面是存储过程的概念:

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,因为我没有执行选择就没有原始值要设置。

如何实现这种影响?

3 个答案:

答案 0 :(得分:3)

UPDATE [dbo].[State] SET Bar = @Bar, Something = ISNULL(@Something,Something) WHERE... 在这里可以正常工作:

"javadoc"

答案 1 :(得分:3)

COALESCE 将为您做到!

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

答案 2 :(得分:1)

可以使用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--)