Sql 如果尚未执行Insert,则不希望执行Update

Sql 如果尚未执行Insert,则不希望执行Update,sql,sql-server,Sql,Sql Server,****质疑***************************** 我有一个存储过程,它有一个更新和一个插入查询。 更新发生在表1中,插入发生在表2中。如果插入查询由于任何原因失败,我不想执行更新,反之亦然。 请告诉我如何实现这一点。我理解的是,我可能必须使用try-catch和begin-and-end-tran和rollback,但无法理解如何实现这一点 我刚刚研究了如何编写Try和catch,以及如何开始和结束tran ****************存储过程*************

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

我刚刚研究了如何编写Try和catch,以及如何开始和结束tran

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

 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

你的研究是正确的:

它将是

Begin Try
    Begin Tran
        Query 1
        Query 2
    Commit Tran
End Try
Begin Catch
    Rollback
End catch
您还可以将更新逻辑移到insert下面,并将DUNS_事务_详细信息与唯一的组合数据连接起来,该数据只是插入以检查insert是否成功

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

您有两个insert,对于其中的insert fail,您不想执行更新查询??如果表变量的insert失败,那么update&insert ALETH语句将不会执行,因此,我认为您已经得到了您想要的。嘿,Susang,这是第二个insertIf,如果我将更新逻辑移到insert下面,并且如果insert失败,那么更新将不会仅发生……这也是解决方案之一。但是我想保持sql脚本的顺序,因为它清楚地描述了业务功能。在您的情况下,我不能说sql脚本的顺序,但如果您在插入后改变更新逻辑,它会更清楚,看起来更有序,但希望是您的:但是,为了更清楚,只有在业务需求允许的情况下,才可以使用join而不是subquery。