2015-10-06 73 views
-1

我想使用合并来结合更新和插入语句,虽然我得到一些错误,我不太确定它的权利。合并语句在一个存储过程中。以下是合并声明。合并声明更新和插入

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]); 

它是我第一次使用合并,所以希望可以得到一些帮助。

谢谢全部

+1

你的问题是什么? –

+0

你的错误是什么? –

+0

在更新,我有错误说'不正确的语法附近dbo'@Radu – Faiz

回答

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

上面的代码可能无法正常工作,因为(在代码的末尾),它试图在表格中插入比表source表中更多列的target表。起初你是说源表由segCreateDate,segDesc,modifiedDate和modifiedBy组成。但最后你还试图插入到seg38,segCode,createdDate和createdBy列中。

这导致我为第二个问题为什么上面的代码无法正常工作:您正尝试在segID上连接源和目标。我不知道这个列是否存在于目标表dbo.seg中。但是这个列当然不包含在上面定义的源表中。