我已经编写了一个存储过程,该过程根据参数中传递的值更新字段。
存储过程
CREATE PROCEDURE T1
(
@a INTEGER,
@b INTEGER,
@c nvarchar(max),
@d nvarchar(max)
)
AS
BEGIN
UPDATE Feed
Set b=@b,
c=ISNULL(@c,c),
d=ISNULL(@d,d),
where a = @a
end
现在,我们可能只需要一次更新一些字段很普遍。假设我只想更新c
。现在,在这种情况下,参数b
&d
应为Null
。因此,我正在用IsNull()
处理。
但是,问题是@b
是int
,因此它作为0
而不是Null
。如何处理此更新。
如果传递的值为 0
,则不应更新该列。
注意:不会有任何情况下我的int
列实际上是0
。
可以通过更新中的案例完成:
CREATE PROCEDURE T1
(
@a INTEGER,
@b INTEGER,
@c nvarchar(max),
@d nvarchar(max)
)
AS
BEGIN
UPDATE Feed
Set b=case when @b = 0 then b else @b end,
c=ISNULL(@c,c),
d=ISNULL(@d,d),
where a = @a
end
如前所述,您可以使用CASE WHEN...
,但我更喜欢使用IIF(@b = 0, b, @b)
更干净
CREATE PROCEDURE T1(
@a INTEGER,
@b INTEGER,
@c nvarchar(max),
@d nvarchar(max)
)
AS
BEGIN
UPDATE Feed
Set b= IIF(@b = 0, b, @b),
c=ISNULL(@c, c),
d=ISNULL(@d, d)
WHERE a = @a
end
文档:
https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-iif-iif-iif-transact-sql?view=sql-server-ver16#syntax
/html>