SQL Server:如何使用MERGE而不是INSERT INTO和UPDATE

时间:2014-08-26 15:51:06

标签: sql sql-server stored-procedures insert merge

我有一个包含以下内容的存储过程。

这用于检查是否存在某个ID。如果不是,则将新记录插入表中,如果是,则更新现有记录。

该过程按预期工作,但我想知道我是否可以使用MERGE来改善代码。 有人可以告诉我如何使用MERGE进行此操作,并且与我的相比有任何优点/缺点吗?

BEGIN
    IF NOT EXISTS
    (
        SELECT      * 
        FROM        MOC_Comments 
        WHERE       commentID = @commentID
    )
        BEGIN

            INSERT INTO MOC_Comments
            (
                    parentID, 
                    comment
            )
            SELECT  @parentID,
                    @comment
        END
    ELSE
        BEGIN

            UPDATE  MOC_Comments
            SET     parentID = @parentID,
                    comment = @comment
        END 
END

非常感谢你提供任何帮助,蒂姆。

1 个答案:

答案 0 :(得分:1)

这是执行您正在寻找的基本合并语句:

我更新了合并的“更新”部分,以显示如何更新记录而不传入“set”方法中的每个参数。合并首先检查源(输入参数),如果为null,它将使用记录中的现有值。这允许您编写一个包含所有可为空参数的set方法,一个用于表或结构中的每一列(唯一约束或主键除外),并且只传入要更新相应记录列的参数。

merge into [dbo].[moc_comments] as target
using (values(@parentid
  , @comment
  , @commentid)) as source ([parentid], [comment], [commentid])
on target.[commentid] = source.[commentid]
when matched then
  update set target.[parentid] = coalesce(source.[parentid], target.[parentid])
         , target.[comment] = coalesce(source.[comment], target.[comment])
when not matched by target then
  insert ([parentid]
      , [comment]
      , [commentid])
  values ([parentid]
      , [comment]
      , [commentid]);