我正在实现一个关键任务存储过程,它将执行 UPDATE
、 DELETE
和 INSERT
,我想确保我的 TRANSACTION
格式正确。
我见过一些 TRANSACTION
语句,其中每一步后都有一个检查。我也看到过这种类型,其中整个步骤集简单地放置在一个 TRANSACTION
块中,沿途没有任何“检查点”。
这是一个格式良好的 TRANSACTION
,如果在任何时候有任何错误,它会回滚所有内容,即 UPDATE
、 DELETE
和 INSERT
。
这是 TRANSACTION
:
BEGIN TRANSACTION
BEGIN TRY
UPDATE SomeTable
SET SomeColumnValue = 123
WHERE Id = 123456
DELETE FROM SomeOtherTable
WHERE Id = 789
INSERT INTO ThirdTable
(Column1, Column2)
VALUE
('Hello World', 1234567)
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
最佳答案
您可以使用如下语法。请注意,当从 begin try 块内部调用具有类似结构的另一个 SP 时,该语法也会处理嵌套事务
BEGIN TRAN
BEGIN TRY
UPDATE SomeTable
SET SomeColumnValue = 123
WHERE Id = 123456
DELETE FROM SomeOtherTable
WHERE Id = 789
INSERT INTO ThirdTable
(Column1, Column2)
VALUE
('Hello World', 1234567)
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
INSERT INTO LogError (
--ErrorID
objectName
,ErrorCode
,ErrorDescription
,ErrorGenerationTime
)
SELECT
-- autogenerated
OBJECT_NAME(@@PROCID)
,ERROR_NUMBER() AS ErrorCode
,'Error of Severity: ' + CAST (ERROR_SEVERITY() AS VARCHAR (4))
+' and State: ' + CAST (ERROR_STATE() AS VARCHAR (8))
+' occured in Line: ' + CAST (ERROR_LINE() AS VARCHAR (10))
+' with following Message: ' + ERROR_MESSAGE() AS ErrorColumnDescription
,GETDATE()
END CATCH
关于sql-server - T-SQL 事务语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48759706/