SQL 存储过程插入而不是更新

时间:2021-04-16 08:26:41

标签: sql-server tsql stored-procedures

我有一个存储过程,用于检查记录是否存在,如果为真,则应更新,否则应插入。但是由于某些奇怪的原因,更新不起作用并且它插入了一条记录。结果我现在在表中积累了重复的记录。如何确保更新与插入分开工作。

CREATE PROCEDURE [dbo].[proc_CustomerAnalysis_Insert]
(
    @CustomerID         INT,
    @UserID             INT,
    @ProcessCompleted   BIT,
    @DeliveryDate       DATETIME,
    @HasOpsNote         BIT,
    @OpsNote            VARCHAR(500),
    @isManual           BIT,
    @FinalStageID       INT,
    @EffectiveDate      DATE,
    @Outcome            VARCHAR(50),
    @ExculdeFromReview  BIT
)
AS
BEGIN
        DECLARE @TempCustomerAnalysis TABLE
        (
            CustomerID          INT ,
            IncreaseDate        DATETIME,
            Ref                 VARCHAR(50),
            RateIncreaseID      INT,
            rn                  INT
        )

IF EXISTS(SELECT CustomerID FROM DUmmy9 WHERE DUmmy9.CustomerID = @CustomerID)
BEGIN
WITH UpdateData AS
        (
            SELECT DISTINCT * 
            FROM (
                SELECT
                    c.CustomerID CustomerID,
                    ri.RateIncreasePeriod IncreaseDate,
                    CONCAT(c.FWRepCode, '\', c.AccountCode) Ref,
                    ri.RateIncreaseID RateIncreaseID,
                    u.Name,
                    row_number() OVER(PARTITION BY c.Name ORDER BY ri.RateIncreasePeriod DESC) AS rn
                    FROM customers c 
                    left outer join DUmmy1 rc on rc.RateClassID = c.RateClassID 
                    left outer join DUmmy2 css on css.CustomerStatusID = c.CustomerStatusID
                    left outer join DUmmy3 ri on ri.RateCycleID = rc.RateCycleID
                    left outer join DUmmy4 fwrm ON fwrm.FWCode = c.FWRepCode
                    left outer join DUmmy5 rcs ON rcs.RepCodeID = fwrm.RepCodeID
                    left outer join DUmmy6 u ON u.UserID = rcs.UserID
                    left outer join DUmmy7 vw on vw.CustomerID = c.CustomerID
                    WHERE c.CustomerStatusID = 3 AND u.UserID = @UserID AND c.CustomerID = @CustomerID 
                ) t
            WHERE t.rn = 1          
        )
        UPDATE DUmmy7 
        SET IncreaseDate = DUmmy8.IncreaseDate, Ref = DUmmy8.Ref, RateIncreaseID = DUmmy8.RateIncreaseID
        FROM UpdateData
        WHERE DUmmy8.CustomerID = @CustomerID
    
END
ELSE
BEGIN
    INSERT INTO @TempCustomerAnalysis(CustomerID, IncreaseDate, Ref, RateIncreaseID, rn)
    SELECT DISTINCT * 
    FROM (
            SELECT
                c.CustomerID CustomerID,
                ri.RateIncreasePeriod IncreaseDate,
                CONCAT(c.FWRepCode, '\', c.AccountCode) Ref,
                ri.RateIncreaseID RateIncreaseID,
                row_number() OVER(PARTITION BY c.Name ORDER BY ri.RateIncreasePeriod DESC) AS rn
                    FROM customers c 
                    left outer join DUmmy1 rc on rc.RateClassID = c.RateClassID 
                    left outer join DUmmy2 css on css.CustomerStatusID = c.CustomerStatusID
                    left outer join DUmmy3 ri on ri.RateCycleID = rc.RateCycleID
                    left outer join DUmmy4 fwrm ON fwrm.FWCode = c.FWRepCode
                    left outer join DUmmy5 rcs ON rcs.RepCodeID = fwrm.RepCodeID
                    left outer join DUmmy6 u ON u.UserID = rcs.UserID
                    left outer join DUmmy7 vw on vw.CustomerID = c.CustomerID
                WHERE c.CustomerStatusID = 3 AND u.UserID = @UserID AND c.CustomerID = @CustomerID
         ) t
    WHERE t.rn = 1

    INSERT INTO DUmmy9(CustomerID, IncreaseDate, ProcessCompleted, DeliveryDate, Ref, HasOpsNote, OpsNote, RateIncreaseID, isManual, FinalStageID, EffectiveDate, Outcome, ExcludeFromReview)
    SELECT 
    CustomerID,
    IncreaseDate, 
    @ProcessCompleted,
    @DeliveryDate,
    Ref,
    @HasOpsNote,
    @OpsNote,
    RateIncreaseID,
    @isManual,
    @FinalStageID,
    @EffectiveDate,
    @Outcome,
    @ExculdeFromReview
    FROM @TempCustomerAnalysis
END
END

2 个答案:

答案 0 :(得分:0)

从你的例子来看。在检查 IF ELSE 之前,您永远不会设置 CustomerAnalysis.CustomerID = @CustomerID,因此该值始终为 NULL/CustomerAnalysis 中从不存在,因此始终进入 ELSE。

答案 1 :(得分:0)

DECLARE @CustomerIDExist INT = (SELECT COUNT(CustomerID) FROM CustomerAnalysis WHERE CustomerAnalysis.CustomerID = @CustomerID)
IF (@CustomerIDExist >= 1)
BEGIN
相关问题