我有两个SQL命令,对我来说都很好。
这是第一个:
DECLARE @SeqID int,
@RtnCode int
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO TableA (Name,Value)
VALUES (@Name,@Value)
SET @SeqID = SCOPE_IDENTITY()
Insert Into TableB(TableASeqID, Name, Vlaue)
Values (@SeqID, @Name, @Value)
COMMIT TRANSACTION
SET @RtnCode = '1'
GOTO FINALMSG
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 BEGIN
ROLLBACK TRANSACTION
SET @RtnCode = '10001'
GOTO FINALMSG
END
END CATCH
FINALMSG:
BEGIN
SELECT
@RtnCode
END
这是第二个:
DECLARE @SeqID int,
@RtnCode int
BEGIN TRANSACTION
INSERT INTO TableA (Name, Value)
VALUES (@Name, @Value)
IF(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
BEGIN
ROLLBACK TRAN
SET @RtnCode = '1001'
GOTO FINALMSG
END
SET @SeqID = SCOPE_IDENTITY()
Insert Into TableB(TableASeqID, Name, Vlaue)
Values (@SeqID, @Name, @Value)
IF(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
BEGIN
ROLLBACK TRAN
SET @RtnCode = '1001'
GOTO FINALMSG
END
COMMIT TRANSACTION
SET @RtnCode = '1'
GOTO FINALMSG
FINALMSG:
BEGIN
SELECT
@RtnCode
END
第一个命令通常用于我的工作,但DBA喜欢第二个命令。
我对此感到困惑。
哪种方式更有效率?
Try Catch是否比使用@@ERROR()
的每个命令更具消费效率?
答案 0 :(得分:0)
我无法想出使用@@RAISEERROR
代替TRY-CATCH
的理由 - 我不认为TRY-CATCH
的效果会比@@RAISEERROR
更好/更差。
TRY-CATCH
可读性好很多,因此很容易
维护或进行更改 - 代码中的一个示例是 - 您不需要使用FINALMSG
GOTO
块和TRY-CATCH
语句
THROW
等功能,而不是处理@@RAISEERROR
及其功能
参数 This文章详细介绍了TRY-CATCH-THROW
及其好处。