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