Sql 用于更新和插入的merge语句

Sql 用于更新和插入的merge语句,sql,tsql,merge,dml,Sql,Tsql,Merge,Dml,我试图使用merge来组合update和insert语句,尽管我遇到了一些错误,我不太确定它是否正确。merge语句位于存储过程中。下面是merge语句 MERGE dbo.seg AS TARGET USING (SELECT segCreateDate , segDesc , modifiedDate , modifiedBy FROM [update].[dbo].[seg] s ) AS source (segCreate

我试图使用merge来组合update和insert语句,尽管我遇到了一些错误,我不太确定它是否正确。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]);
将dbo.seg合并为目标
使用(选择segCreateDate)
,segDesc
,修饰
,由
来自[update].[dbo].[seg]s
)作为源(segCreateDate)
,segDesc
,修饰
,经修改)
在(dbo.[seg].segID=s.segID上
及(
dbo.[seg].segCreateDate>s.segCreateDate
或dbo[seg].segDesc s.segDesc
)
)
当匹配时
更新dbo.seg集
target.segCreateDate=source.segCreateDate
和target.segDesc=source.segDesc
并且target.modifiedDate=source.modifiedDate
并且target.modifiedBy=source.modifiedBy
当不匹配时
插入(segID)
,segCode
,segDesc
,segCreateDate
,createdDate
,由
,修饰
,由
)
值(选择segID
,segCode
,segDesc
,segCreateDate
,createdDate
,由
,修饰
,由
来自[update].[dbo].[seg];
这是我第一次使用merge,希望能得到一些帮助


谢谢大家

您的合并语句有几个问题。这可能是你想要的

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
           );
将dbo.seg合并为目标
使用
(
选择segCreateDate,
塞格迪斯,
修改的日期,
修改
来自[update].dbo.seg s
)作为源(segCreateDate、segDesc、modifiedDate、modifiedBy)
在(
TARGET.segID=source.segID
及(
TARGET.segCreateDate>source.segCreateDate
或TARGET.segDesc source.segDesc
)
)
当匹配时
更新设置TARGET.segCreateDate=source.segCreateDate,
TARGET.segDesc=source.segDesc,
TARGET.modifiedDate=source.modifiedDate,
TARGET.modifiedBy=source.modifiedBy
当不匹配时
插入(
塞吉德,
segCode,
塞格迪斯,
segCreateDate,
创建日期,
由,
修改的日期,
修改
)
价值观(
source.segID,
source.segCode,
source.segDesc,
source.segCreateDate,
source.createdDate,
source.createdBy,
source.modifiedDate,
source.modifiedBy
);
请注意,(1)在更新表时,您不会在每列之后写入
,而只是添加一个逗号。(2)如果使用<代码>源<代码> >代码>目标< /代码>作为表别名,则应坚持它们,不要在中间更改为<代码> s>代码>而不是<代码>源<代码> > 

尽管如此,上述代码仍可能无法工作,因为(在代码末尾)它试图在
目标
表中插入比
表中更多的列。首先,您说源表由segCreateDate、segDesc、modifiedDate和modifiedBy组成。但在最后,您还试图将segID、segCode、createdDate和createdBy列插入到
target


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

您的问题是什么?在更新时,我在那里错误地说“dbo附近的语法不正确”@Radu@Randy我的问题是我不认为我写的是有效的。我使用的逻辑正确吗?我觉得这是错误的。。[更新].[dbo].[seg]ya我几分钟前在这里看到,我正要编辑它。它实际上是update.dbo.seg,sql对此很满意。在update语句中,dbo带红色下划线,在值中,选择,最后一个箭头也带红色下划线。我对这件事很困惑