将存储过程与数据类型转换合并

时间:2016-01-07 22:18:11

标签: sql-server-2008 tsql stored-procedures sql-server-2005 sql-server-2012

我能够执行我的存储过程。当我第二次执行它而不是更新现有值时,将从源中插入相同的值作为新值。

,即我的目标有

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

由于

1 个答案:

答案 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

            )