在存储过程中使用带有可选参数的UPDATE

时间:2010-07-20 13:51:23

标签: sql-server stored-procedures

我有一个像这样的SP(使用SQL Server):

ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
    @id uniqueidentifier,
    @ordering smallint = NULL,
    @title nvarchar(20) = NULL,
    @content text = NULL
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE tbl_ClientNotes
    SET ordering=@ordering, title=@title, content=@content
    WHERE id=@id
END

我想只设置值,如果它们被传递到SP,即不是NULL。可以这样做吗?

This question似乎建议唯一的方法是使用完全独立的条件查询,但对于3个可选参数,这显然是一场噩梦!

5 个答案:

答案 0 :(得分:39)

试试这个。

ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
    @id uniqueidentifier,
    @ordering smallint = NULL,
    @title nvarchar(20) = NULL,
    @content text = NULL
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE tbl_ClientNotes
    SET ordering=ISNULL(@ordering,ordering), 
        title=ISNULL(@title,title), 
        content=ISNULL(@content, content)
    WHERE id=@id
END

WHERE子句中添加一个额外的部分也是值得的,如果你使用事务复制,那么如果所有都是NULL,它将向订阅者发送另一个更新,以防止这种情况发生。

WHERE id=@id AND (@ordering IS NOT NULL OR
                  @title IS NOT NULL OR
                  @content IS NOT NULL)

答案 1 :(得分:3)

   UPDATE tbl_ClientNotes
    SET 
      ordering=ISNULL@ordering,ordering), 
      title=isnull(@title,title), 
      content=isnull(@content,content)
    WHERE id=@id

我想我记得在此之前看到如果你正在更新到相同的值,SQL Server将实际识别这个并且不会进行不必要的写入。

答案 2 :(得分:3)

一个想法:

UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title),  content=ISNULL(@content, content)
WHERE id=@id

答案 3 :(得分:0)

UPDATE tbl_ClientNotes 
SET ordering=@ordering, title=@title, content=@content 
WHERE id=@id 
AND @ordering IS NOT NULL
AND @title IS NOT NULL
AND @content IS NOT NULL

或者,如果您的意思是您只想更新单个列,则可以使用我上面的帖子。我读它是因为如果任何值为null则不更新

答案 4 :(得分:0)

ALTER PROCEDURE LN
    (
    @Firstname nvarchar(200)
)

AS
BEGIN

    UPDATE tbl_Students1
    SET Firstname=@Firstname 

    WHERE Studentid=3
END


exec LN 'Thanvi'