2012-03-05 66 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