sql - 将sql与日期条件合并

标签 sql stored-procedures

我创建了合并存储过程,如下所示,我想要实现的是以下场景:

  • 如果 ProductTRN 不存在于 ProductList 表中,则合并新记录(完整)
  • 仅更新 PU.CreateDate 大于目标表(ProductList 的 CreateDate)的 ProductList 记录(不完整)

请告诉我如何实现上面的第二种情况,谢谢

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

最佳答案

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
  )

关于sql - 将sql与日期条件合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451350/

相关文章:

java - 如何将 BLOB 数组传递给存储的 oracle 过程?

java - 如何将 jar 文件包含到 Oracle 中的 Java 存储过程中?

sql-server - 如何从存在 JOIN 的 CTE 中删除?

php - 移动到新服务器后无法写入 MYSQL DB

c# - 输出参数有什么问题?

sql-server - 使用 ADODB 中的变量从 SQL Server 存储过程返回结果

sql-server - 存储过程返回一行、记录集或输出参数?

mysql - sql连接不在选择中

sql - SQL查询集合中的第一行,最后一行,最后一行

mysql - 连接等价 - 括号重载