【问题标题】:Dont want to execute Update if Insert has not been executed如果尚未执行插入,则不想执行更新
【发布时间】:2019-09-20 04:53:01
【问题描述】:

****查询********************************** 我有一个存储过程,它有一个更新和一个插入查询。 更新发生在表 1 中,插入发生在表 2 中。如果插入查询由于任何原因失败,我不想执行更新,反之亦然。 请告诉我如何实现。我的理解是我可能不得不使用 try catch 和 begin 和 end tran 和 rollback 但无法理解如何实现。


刚刚研究了怎么写Try and catch和begin tran and end it。

****************存储过程********************************** **************

 INSERT INTO @TempVariable(DUNS_Request_ID ,DUNS_Transaction_ID,DUNS_Status_ID)

SELECT T1.DUNS_Request_ID,T2.DUNS_Transaction_ID,DUNS_Status_ID
FROM   DUNS_Request_Master T1 
       LEFT JOIN DUNS_Transactions T2 ON T1.DUNS_Request_ID=T2.DUNS_Request_ID
WHERE  T1.DUNS_Request_ID IN 
      (SELECT DUNS_Request_ID FROM DUNS_Transactions WHERE DUNS_Status_ID = 2)
       AND CONVERT(DATE,RequestedDate) <= DATEADD(DAY, -1,CONVERT(DATE,GETDATE()))

UPDATE DUNS_Transactions 
SET    
       AssignedToUser_ID              = @ContentUserID
      ,DUNS_Status_ID                 = @FreeDUNSStatusID
      ,DUNS_Transaction_Update_Status = 'Automatic Conversion to Free DUNS'
      ,ProcessedDateTime              = GETDATE()

WHERE DUNS_Request_ID IN (SELECT DUNS_Request_ID FROM @TempVariable)

INSERT INTO    [DUNS_Transaction_Details]
               (
                DUNS_Request_ID,
                DUNS_Transaction_ID,
                DUNS_Status_ID,
                AssignedToUser_ID,
                AssignedByUser_ID,
                Comments,
                CommentsBy,
                CommentDate,
                ProcessedDateTime,
                IsActive
                )
        SELECT  DUNS_Request_ID,
                DUNS_Transaction_ID,
                @FreeDUNSStatusID,
                @ContentUserID,
                NULL,
                'Automatic Conversion to Free DUNS',
                NULL,
                GETDATE(),
                GETDATE(),
                1
        FROM    @TempVariable

【问题讨论】:

  • 你有两个插入,插入失败你不想执行更新查询??如果表变量的插入失败,则不会执行更新和插入这两个语句,因此,我认为您已经拥有了您想要的。
  • 嘿 Susang,这是第二次插入

标签: sql sql-server


【解决方案1】:

你的研究是正确的:

会的

Begin Try
    Begin Tran
        Query 1
        Query 2
    Commit Tran
End Try
Begin Catch
    Rollback
End catch

【讨论】:

    【解决方案2】:

    您还可以将update 逻辑移到insert 下方,并使用刚刚插入的唯一组合数据加入DUNS_Transaction_Details,以检查插入是否成功

    UPDATE DT SET    
        AssignedToUser_ID = @ContentUserID
        ,DUNS_Status_ID = @FreeDUNSStatusID
        ,DUNS_Transaction_Update_Status = 'Automatic Conversion to Free DUNS'
        ,ProcessedDateTime = GETDATE()
    FROM DUNS_Transactions  DT
    INNER JOIN @TempVariable T ON T.DUNS_Request_ID = DT.DUNS_Request_ID
    --Below join will check if insert is success - Join with unique columns
    INNER JOIN DUNS_Transaction_Details DTD ON DTD.DUNS_Request_ID = T.DUNS_Request_ID 
        AND DTD.DUNS_Transaction_ID = T.DUNS_Transaction_ID 
    --You can add more columns in the join to make it unique combination
    

    【讨论】:

    • 如果我将更新逻辑转移到插入下方,并且如果插入失败,那么更新将不会发生......这也可以是解决方案之一。但我想保持 sql 脚本的顺序,因为它清楚地描述了业务功能。
    • 在你的情况下我不能说order of sql scripts,但如果你在插入后改变更新逻辑但希望是你的,它会更清楚并且看起来很有序:) 但是,为了更清楚只有当您的业务需求允许时,您才能使用join 而不是subquery
    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2010-11-24
    相关资源
    最近更新 更多