SQL Server 存储过程传递旧值而不是新值

SQL Server stored procedure passing old values not new value

提问人:Nandkumar Gaikwad 提问时间:1/16/2023 最后编辑:Nandkumar Gaikwad 更新时间:1/18/2023 访问量:183

问:

这是我的表格:

search_id search_term clicked count
------------------------------
1        rabbit        0         5
2        airline       1         4

这是我的存储过程:

alter procedure update_item
    (@search_id int,
     @search_term varchar(50),
     @clicked int)
as
begin
    update search_events 
    set search_term= @search_term,
        clicked = @clicked
    where search_id = @search_id
end

--exec update_item @search_id=1,@search_term='rabbit',@clicked=0

我创建了一个存储过程,并传递了两个参数。

我只想传递一个参数来更新记录,第二个参数值将是旧值。

可以使用旧值传递参数。

例如:

exec update_item @search_id= 1, @search_term= 'pass here old value that it is rabbit', @clicked = 1

仅将单击的值更新为 0 的 1。

sql-server stored-procedures 参数传递

评论

2赞 Thom A 1/16/2023
我真的建议修复参数中的印刷错误;当您拼写正确时,此类错误可能会使调试成为将来的真正问题。@serachidsearchid
0赞 Jonathan Willcock 1/16/2023
如果您的search_id是唯一键,则根本不需要第二个参数。如果您只想更新单击,则只需使用 .update search_events set clicked=@clicked where search_id=@serachid
0赞 Ortiga 1/16/2023
你在这里的最终目标是什么?是否要创建一个可选参数,如果未指定,则默认为“rabbit”?
0赞 Thom A 1/16/2023
也许需要有一个默认值 (?),然后您可以在子句中使用 /?@searchitemNULLISNULLCOALESCESET
0赞 Nandkumar Gaikwad 1/17/2023
@jonathanwillcock先生,我正在使用带有传递参数的存储过程,并且该参数是强制性的,在某些情况下它很重要,在某些情况下则不重要,因为我需要解决方案来维护旧值。

答:

0赞 Ortiga 1/18/2023 #1

如果只需要一个参数,则可以使用简单的 if 语句,如果值为 null,则省略 set 子句

CREATE PROCEDURE update_item (
    @search_id INT
    ,@search_term VARCHAR(50)
    ,@clicked INT
    )
AS
BEGIN
    IF (@search_term IS NULL)
        UPDATE search_events
        SET clicked = @clicked
        WHERE search_id = @search_id
    ELSE
        UPDATE search_events
        SET search_term = @search_term
            ,clicked = @clicked
        WHERE search_id = @search_id
END

如果需要检查更多参数,则需要动态生成 update 语句。基本示例如下:

ALTER PROCEDURE update_item (
    @search_id INT
    ,@search_term VARCHAR(50)
    ,@clicked INT
    )
AS
BEGIN
    DECLARE @Sql NVARCHAR(4000) = N'UPDATE search_events SET ',
            @Params NVARCHAR(300) = N'@search_id INT, @search_term VARCHAR(50), @clicked INT'
    
    IF (@search_term IS NOT NULL)
        SET @Sql = @Sql + ' search_term = @search_term,'

    SET @Sql = @Sql + ' clicked = @clicked'

    SET @Sql = @Sql + ' WHERE search_id = @search_id' 
    
    EXEC sp_executesql @Sql, @Params, @search_id=@search_id, @search_term=@search_term, @clicked=@clicked
END