2013-12-08 46 views
0

我已創建合併的存儲過程如下,我想實現的是以下情況:合併SQL與日期條件

  • 合併的新記錄,如果ProductTRN沒有在產品列表表(完整的)存在
  • 只有在更新在PU.CreateDate比是產品列表(未完成)目標表的CREATEDATE更大的產品列表記錄

請問我該如何才能實現上述第二個方案,謝謝

CREATE PROCEDURE [dbo].[usp_ProductList_Merge] 
AS 
    BEGIN 

    DECLARE @retValue INT 
     BEGIN TRY 
      IF OBJECT_ID('ProductList') IS NOT NULL 
       BEGIN 
        BEGIN TRANSACTION MergeConsumerTable 
        SET NOCOUNT ON; 
        MERGE dbo.ProductList AS target 
         USING 
          (SELECT  

        PU.ProductTRN, 
        PU.ProductName, 
           PU.ProductDescription, 
             PU.CreateDate 

           FROM  dbo.TmpProductList PU 
           WHERE  PU.ProductTRN = ProductTRN 



          ) AS source ( 
        ProductTRN, 
             ProductName, 
             ProductDescription 
        CreateDate) 

         ON ((target.ProductTRN) = LOWER(source.ProductTRN) 

          ) 
         WHEN MATCHED 
          THEN 
     UPDATE    SET 
       ProductTRN= source.ProductTRN 
         WHEN NOT MATCHED 
          THEN  
     INSERT (


        ProductTRN, 
        ProductName, 
        ProductDescription, 
      CreateDate 

       )    VALUES 
       ( 
      source.ProductTRN, 
        source.ProductName, 
        source.ProductDescription, 
        source.CreateDate, 


       ); 
        DELETE PU 
        FROM dbo.TmpProductList PU 


        COMMIT TRANSACTION MergeProductListTable 
        SET @retValue = 1 
        SELECT @retValue 
       END 
      ELSE 
       BEGIN 
       SET @retValue = -1 
        SELECT @retValue 
       END 
     END TRY 
     BEGIN CATCH 
      ROLLBACK TRANSACTION MergeProductListTable 
      DECLARE @ErrorMsg VARCHAR(MAX); 
      DECLARE @ErrorSeverity INT; 
      DECLARE @ErrorState INT; 
      SET @ErrorMsg = ERROR_MESSAGE(); 
      SET @ErrorSeverity = ERROR_SEVERITY(); 
      SET @ErrorState = ERROR_STATE(); 
     SET @retValue = 0 
     SELECT @retValue 
      -- SELECT 0 AS isSuccess 
     END CATCH 
    END 

回答

0
WITH Source AS (
    SELECT ProductTRN 
     ,ProductName 
     ,ProductDescription 
     ,CreateDate 
    FROM dbo.TmpProductList 
) 
MERGE ProductList AS Target 
USING Source 
     ON Target.ProductTRN = Source.ProductTRN 
WHEN MATCHED 
    AND Source.CreatedDate > Target.CreatedDate 
THEN UPDATE SET 
    ProductName = Source.ProductName 
    ,ProductDescription = Source.ProductDescription 
    ,CreateDate = Source.CreatedDate 
WHEN NOT MATCHED BY TARGET 
THEN INSERT (
    ProductTRN 
    ,ProductName 
    ,ProductDescription 
    ,CreateDate 
) 
    VALUES (
    Source.ProductTRN 
    ,Source.ProductName 
    ,Source.ProductDescription 
    ,Source.CreatedDate 
)