仅当新值不为零时才更新



我已经编写了一个存储过程,该过程根据参数中传递的值更新字段。

存储过程

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()处理。

但是,问题是@bint,因此它作为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>

最新更新