我有一个存储过程,用于根据表是否存在某个列的值来插入或更新表。除了我只想在已传递参数的情况下设置某些列的值之外,此方法工作正常。这是因为我不想用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,因为我没有执行选择就没有原始值要设置。
如何实现这种影响?
答案 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--)