2012-03-05 70 views
0

这是MERGE命令的合适人选吗?在将INSERT UPDATE转换为MERGE时需要帮助

源数据也必须是另一个表,还是可以通过变量?

如果它必须是一个表,是否将传递的变量插入到临时表中?

你能帮我一下吗?

CREATE PROCEDURE [dbo].[usp_ConvertToMerge] 
    @GL_DT   date 
    ,@SRC_SYS_ID  varchar(60) 
    ,@MLR_SRC_SYS_CD char(3) 
    ,@TRSRY_FEED_DT date 
    ,@Data   varchar(20) 
AS 
    BEGIN 
     IF NOT EXISTS (SELECT 
          @GL_DT 
         FROM 
          MLR_REBATE_IBOR_INFO_2 
         WHERE 
          [GL_DT] = @GL_DT 
          AND [SRC_SYS_ID]  = @SRC_SYS_ID 
          AND [MLR_SRC_SYS_CD] = @MLR_SRC_SYS_CD 
          AND [TRSRY_FEED_DT] = @TRSRY_FEED_DT) 
      BEGIN 
       INSERT INTO [dbo].[MLR_REBATE_IBOR_INFO_2] 
          ([GL_DT], 
          [SRC_SYS_ID], 
          [MLR_SRC_SYS_CD], 
          [TRSRY_FEED_DT], 
          [Data]) 
       SELECT 
        @GL_DT 
        ,@SRC_SYS_ID 
        ,@MLR_SRC_SYS_CD 
        ,@TRSRY_FEED_DT 
        ,@Data 

      END 
     ELSE 
      BEGIN 
       UPDATE [dbo].[MLR_REBATE_IBOR_INFO_2] 
       SET [Data] = @Data 
       WHERE [GL_DT] = @GL_DT 
         AND [SRC_SYS_ID]   = @SRC_SYS_ID 
         AND [MLR_SRC_SYS_CD]  = @MLR_SRC_SYS_CD 
         AND [TRSRY_FEED_DT]  = @TRSRY_FEED_DT 
      END 
    END 

GO 
+2

是的,这是合并一个很好的候选人。 MERGE旨在阻止这是单独的交易问题。您知道IF NOT EXISTS可以返回true,但在您更新时可能是false,对吧?如果您执行UPDATE,并且插入@@ rowcount = 0,那么它是相同的,尽管这种方法对我来说一直比较干净(少一次扫描=较少的阻止/锁定)。 – 2012-03-06 00:27:03

回答

0

我想我做到了:

CREATE PROCEDURE MyMergeTest 
    @GL_DT    date 
    ,@SRC_SYS_ID  char(20)  
    ,@MLR_SRC_SYS_CD char(3) 
    ,@TRSRY_FEED_DT  date 
    ,@Data    varchar(20) 
AS 
BEGIN 

    MERGE MLR_REBATE_IBOR_INFO_2 AS target 
    USING 
     (
     SELECT 
      @GL_DT 
      ,@SRC_SYS_ID 
      ,@MLR_SRC_SYS_CD    
      ,@TRSRY_FEED_DT 
      ,@Data 
     ) AS source 
     (
      GL_DT 
      ,SRC_SYS_ID 
      ,MLR_SRC_SYS_CD    
      ,TRSRY_FEED_DT 
      ,Data 
     ) 

    ON (
     target.GL_DT   = source.GL_DT    AND 
     target.SRC_SYS_ID  = source.SRC_SYS_ID   AND 
     target.MLR_SRC_SYS_CD = source.MLR_SRC_SYS_CD  AND 
     target.TRSRY_FEED_DT = source.TRSRY_FEED_DT 
     ) 
    WHEN MATCHED THEN 
     UPDATE SET Data = source.Data 
    WHEN NOT MATCHED THEN 
     INSERT 
      (
      [GL_DT], 
      [SRC_SYS_ID], 
      [MLR_SRC_SYS_CD], 
      [TRSRY_FEED_DT], 
      [Data] 
      ) 
     VALUES 
      (
      [GL_DT], --<<it looks like these can eiether be the variable eg, @GL_DT, or prefixed by 'source.' 
      [SRC_SYS_ID], 
      [MLR_SRC_SYS_CD], 
      [TRSRY_FEED_DT], 
      [Data]   
      ); 



END