SQL存储过程:如果变量不为null,则更新语句

Jak*_*ake 22 sql t-sql stored-procedures sql-update

我在存储过程中有一个更新语句,看起来像这样:

Update [TABLE_NAME]
Set XYZ=@ABC
Run Code Online (Sandbox Code Playgroud)

如果变量不为null或值为-1,是否有一种只触发update语句的好方法?

类似于一个IF NOT EXISTS...INSERT问题.

非常感谢.

Jam*_*ill 43

使用T-SQL IF:

IF @ABC IS NOT NULL AND @ABC != -1
    UPDATE [TABLE_NAME] SET XYZ=@ABC
Run Code Online (Sandbox Code Playgroud)

看看MSDN文档.

  • 那简单吧?好吧,我要去一个电源插座的叉子,从大西洋城的后巷和其他同样愚蠢的东西上划一根脏针.谢谢您的帮助. (8认同)

Ada*_*ess 25

当您有许多更新时,另一种方法是使用COALESCE:

UPDATE [DATABASE].[dbo].[TABLE_NAME]
SET    
    [ABC]  = COALESCE(@ABC, [ABC]),
    [ABCD] = COALESCE(@ABCD, [ABCD])
Run Code Online (Sandbox Code Playgroud)

  • 这就是我在试图做到的桌子上.当涉及十几个专栏时,比一堆"if-update"对更好看. (5认同)

小智 5

另一种方法是 ISNULL()。

UPDATE [DATABASE].[dbo].[TABLE_NAME]
SET    
    [ABC]  = ISNULL(@ABC, [ABC]),
    [ABCD] = ISNULL(@ABCD, [ABCD])
Run Code Online (Sandbox Code Playgroud)

ISNULL 和 COALESCE 之间的区别在于返回类型。COALESCE 还可以采用两个以上的参数,并使用第一个不为空的参数。IE

select COALESCE(null, null, 1, 'two') --returns 1
select COALESCE(null, null, null, 'two') --returns 'two'
Run Code Online (Sandbox Code Playgroud)

需要注意的是,如果 COALESCE 没有非 NULL 的参数,它将抛出异常,因此如果只有两个参数并且两者都可以为 null - 请使用 ISNULL。