0

我能夠執行我的存儲過程。當我再次執行它而不是更新現有值時,將從源中插入相同的值作爲新值。將數據類型轉換合併存儲過程

即我的目標有

1 
2 
3 

當我運行存儲過程第二次,而不是更新1,2,3,這是對於插入時相同

1 
2 
3 
1 
2 
3 

我的狀態匹配,然後選擇S.REPORT_TEST1,除了T.REPORT_TEST1不起作用。

當我在不具有數據轉換的不同表上使用相同的代碼時,我可以更新。

任何人都可以告訴我哪裏錯了嗎?

CREATE PROCEDURE [dbo].[Merge] 
    INSERT INTO .[dbo].[TARGET](REPORT_TEST1, REPORT_TEST2, REPOST_TEST3) 
    FROM (MERGE [dbo].[TARGET] T 
      USING (SELECT 
        Cast([REPORT TEST1] as int) [REPORT_TEST1], 
        Cast([REPORT TEST2] as int) [REPORT_TEST2], 
        Cast([REPORT TEST3] as int) [REPORT_TEST3]  
       FROM 
        [dbo].[SOURCE]) S ON (T.[REPORT_TEST1] = S.[REPORT_TEST1]) 

      WHEN NOT MATCHED BY TARGET 
      THEN INSERT     
       VALUES (S.REPORT_TEST1, S.REPORT_TEST2, S.REPOST_TEST3) 

      WHEN MATCHED 
      AND EXISTS (SELECT S.REPORT_TEST1, S.REPORT_TEST2, S.REPOST_TEST3 
         EXCEPT 
         SELECT T.REPORT_TEST1, T.REPORT_TEST2, T.REPOST_TEST3) 
      OUTPUT $ACTION ACTION_OUT, 
       S.REPORT_TEST1, S.REPORT_TEST2, S.REPOST_TEST3) ; 

感謝

回答

0

將它不足以正是如此重寫你的WHEN MATCHED聲明:

WHEN MATCHED 
    AND S.REPORT_TEST2 <> T.REPORT_TEST2 
    AND S.REPORT_TEST3 <> T.REPORT_TEST3 
    (
     SELECT 
      S.REPORT_TEST1 
      ,S.REPORT_TEST2 
      ,S.REPOST_TEST3 
    ) 

我想我明白你想要做什麼,但MERGE上下文中,你只將該行與該行進行比較,而不是針對整個目標表的源行。如果您試圖查詢「此源根本不在目標中」,則可以這樣修改子查詢:

WHEN MATCHED AND EXISTS 
      (
       SELECT 
        S.REPORT_TEST1 
        ,S.REPORT_TEST2 
        ,S.REPOST_TEST3 
       EXCEPT SELECT 
        T2.REPORT_TEST1 
        ,T2.REPORT_TEST2 
        ,T2.REPOST_TEST3 
       FROM 
        [dbo].[TARGET] T2 

      ) 
+0

感謝您的回覆。 – Durga

+0

除了在合併工作,但'當不符合目標然後插入'插入重複。 – Durga

相關問題