合并声明以进行更新并插入

时间:2015-10-06 14:16:34

标签: sql tsql merge dml

我正在尝试使用merge来组合更新和插入语句,虽然我收到一些错误,我不太确定它是对的。 merge语句位于存储过程中。以下是合并声明。

MERGE dbo.seg AS TARGET
USING (SELECT segCreateDate
        , segDesc
        , modifiedDate
        , modifiedBy 
    FROM [update].[dbo].[seg] s
    ) AS source (segCreateDate
                , segDesc
                , modifiedDate
                , modifiedBy)
        ON  (dbo.[seg].segID = s.segID
            AND (
                 dbo.[seg].segCreateDate > s.segCreateDate
                 OR dbo.[seg].segDesc <> s.segDesc
                )
    )

WHEN MATCHED THEN
UPDATE dbo.seg SET
  target.segCreateDate = source.segCreateDate
  AND target.segDesc = source.segDesc
  AND target.modifiedDate = source.modifiedDate
  AND target.modifiedBy = source.modifiedBy

WHEN NOT MATCHED THEN
INSERT (segID
        , segCode
        , segDesc
        , segCreateDate
        , createdDate
        , createdBy
        , modifiedDate
        , modifiedBy
        )
VALUES (SELECT  segID
                ,segCode
                ,segDesc
                ,segCreateDate
                ,createdDate
                ,createdBy
                ,modifiedDate
                ,modifiedBy
         FROM [update].[dbo].[seg]);

这是我第一次使用merge,希望能得到一些帮助。

全部谢谢

1 个答案:

答案 0 :(得分:0)

您的合并声明存在一些问题。这是你可能想要的。

merge dbo.seg as TARGET
using
    (
     select segCreateDate,
            segDesc,
            modifiedDate,
            modifiedBy
     from   [update].dbo.seg s
    ) as source (segCreateDate, segDesc, modifiedDate, modifiedBy)
on (
    TARGET.segID = source.segID
    and (
         TARGET.segCreateDate > source.segCreateDate
         or TARGET.segDesc <> source.segDesc
        )
   )
when matched then
    update set TARGET.segCreateDate = source.segCreateDate,
               TARGET.segDesc = source.segDesc,
               TARGET.modifiedDate = source.modifiedDate,
               TARGET.modifiedBy = source.modifiedBy
when not matched then
    insert (
            segID,
            segCode,
            segDesc,
            segCreateDate,
            createdDate,
            createdBy,
            modifiedDate,
            modifiedBy
           )
    values (
            source.segID,
            source.segCode,
            source.segDesc,
            source.segCreateDate,
            source.createdDate,
            source.createdBy,
            source.modifiedDate,
            source.modifiedBy
           );

注意(1)更新表格时,不要在每列之后写and,而只是添加逗号。 (2)如果您使用SourceTarget作为表别名,那么您应该坚持使用它们并且不要在中间更改为s而不是source }。

上面的代码仍然可能不起作用,因为(在代码的末尾)它试图在target表中插入比source表中更多的列。首先,您说源表包含segCreateDate,segDesc,modifiedDate和modifiedBy。但最后你还试图插入target列segID,segCode,createdDate和createdBy。

这引出了第二个问题,为什么上面的代码无法工作:你试图在segID上加入源和目标。我无法判断目标表dbo.seg中是否存在此列。但是这个列肯定不包含在上面定义的源表中。