代码之家  ›  专栏  ›  技术社区  ›  DisgruntledGoat

使用带有可选参数的存储过程中的更新

  •  23
  • DisgruntledGoat  · 技术社区  · 14 年前

    我有一个类似的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时设置这些值,即不为空。能做到吗?

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

    5 回复  |  直到 10 年前
        1
  •  38
  •   Chris Diver    14 年前

    试试这个。

    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 子句,如果您使用事务复制,那么它将向订阅服务器发送另一个更新(如果全部为空),以防止发生这种情况。

    WHERE id=@id AND (@ordering IS NOT NULL OR
                      @title IS NOT NULL OR
                      @content IS NOT NULL)
    
        2
  •  3
  •   Martin Smith    14 年前
       UPDATE tbl_ClientNotes
        SET 
          ordering=ISNULL@ordering,ordering), 
          title=isnull(@title,title), 
          content=isnull(@content,content)
        WHERE id=@id
    

    我想我记得以前看到过,如果更新到相同的值,SQL Server实际上会识别这个值,并且不会进行不必要的写入。

        3
  •  3
  •   Ian Jacobs    14 年前

    一个想法:

    UPDATE tbl_ClientNotes
    SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title),  content=ISNULL(@content, content)
    WHERE id=@id
    
        4
  •  0
  •   FlyingStreudel    14 年前
    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
    

    或者,如果您只想更新单独的列,您可以使用我上面的帖子。我把它读作如果任何值为空就不更新

        5
  •  -2
  •   slavoo user3099232    10 年前
    ALTER PROCEDURE LN
        (
        @Firstname nvarchar(200)
    )
    
    AS
    BEGIN
    
        UPDATE tbl_Students1
        SET Firstname=@Firstname 
    
        WHERE Studentid=3
    END
    
    
    exec LN 'Thanvi'