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

Kie*_*ran 1 t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

我正在尝试完成这样的事情:

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

但我不相信我可以使用 CASE,因为我没有在不执行选择的情况下设置原始值。

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

use*_*983 5

ISNULL 在这里可以正常工作:

UPDATE [dbo].[State]
SET Bar = @Bar, 
    Something = ISNULL(@Something,Something)
WHERE...
Run Code Online (Sandbox Code Playgroud)