我能够执行我的存储过程。当我第二次执行它而不是更新现有值时,将从源中插入相同的值作为新值。
,即我的目标有
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 :(得分: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上下文中,你只是将这一行与该行进行比较,而不是与整个目标表的源行进行比较。如果您正在尝试查询&#34;此来源根本不在目标中,您可以修改子选择&#34;
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
)