2015-10-06 94 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中。但是這個列當然不包含在上面定義的源表中。