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

相关问题