仅当新值非零时才更新:SQL存储过程字段更新优化问询
解决仅当新值非零时更新字段的存储过程调整
嘿,这个需求挺常见的,咱们直接修改存储过程里的字段赋值逻辑就可以搞定~
你原来用ISNULL()是处理参数为NULL时保留原值,现在要改成仅当新值满足“非零”条件时才更新,我们可以用CASE WHEN语句来实现条件判断,针对不同数据类型的参数做对应的逻辑处理:
修改后的完整存储过程代码
CREATE PROCEDURE T1 ( @a INTEGER, @b INTEGER, @c nvarchar(max), @d nvarchar(max) ) AS BEGIN UPDATE Feed SET -- 针对整数参数@b:仅当传入值≠0时更新,否则保留原字段值 b = CASE WHEN @b <> 0 THEN @b ELSE b END, -- 针对字符串参数@c:仅当传入值非空且非NULL时更新(如果你的"非零"是指≠'0',可以把条件改成@c <> '0') c = CASE WHEN @c IS NOT NULL AND @c <> '' THEN @c ELSE c END, -- 同理处理@d d = CASE WHEN @d IS NOT NULL AND @d <> '' THEN @d ELSE d END WHERE a = @a END
逻辑说明
整数参数
@b:
用CASE WHEN @b <> 0 THEN @b ELSE b END,意思很直白——只有当传入的@b不等于0时,才把字段b更新为新值;如果@b是0或者NULL,就保持原字段的值不变。字符串参数
@c/@d:
这里我默认你说的“非零”是指非空字符串且不为NULL(毕竟字符串没有数值意义上的零)。如果你的实际需求是“字符串不等于'0'”,只需要把判断条件改成@c IS NOT NULL AND @c <> '0'就行,灵活调整。
另外注意:你原来的代码里UPDATE语句的SET部分末尾多了个多余的逗号,我已经去掉了,不然执行时会触发语法错误哦~
内容的提问来源于stack exchange,提问作者Harshil Doshi
相关产品推荐
相关产品推荐

