gpt4 book ai didi

sql - 还有一个回滚错误和 tSQLt.ExpectException

转载 作者:行者123 更新时间:2023-12-03 00:10:25 26 4
gpt4 key购买 nike

这是场景:

  1. 存储过程sproc_a调用sproc_b。然后sproc_b调用sproc_c。典型的嵌套过程。
  2. Sproc_a 执行了 SET XACT_ABORT ON;并使用命名事务。
  3. Sproc_c 引发错误。
  4. tSQLt.ExpectException 未能确认错误。测试应该成功,但失败了。

下面是复制该场景的代码。

create procedure sproc_c
as
RAISERROR('An error is found', 11, 1)
go

create procedure sproc_b
as
exec dbo.sproc_c;
go

create procedure sproc_a
as
SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
SET ANSI_WARNINGS OFF

declare @transactionName as varchar(50) = '[POC]';

begin tran @transactionName
save tran @transactionName

exec dbo.sproc_b;
commit tran @transactionName
go

CREATE PROCEDURE [test sproc_a]
AS
-- Assert
BEGIN
EXEC tSQLt.ExpectException
@ExpectedMessage = 'An error is found'
END

-- Act
BEGIN
EXEC dbo.sproc_a
END
GO

EXEC tSQLt.Run '[test sproc_a]'

当我删除 SET XACT_ABORT ON 时,单元测试成功,但出现错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 0,当前计数 = 1。

这更像是一个错误报告。好吧,我想也许问题是:有人知道如何解决它吗? :)

最佳答案

应用 How to ROLLBACK a transaction when testing using tSQLt 中的逻辑添加一个 TRY CATCH 来检查是否仍然需要 ROLLBACK。

create procedure sproc_c
as
RAISERROR('An error is found', 11, 1)
go

create procedure sproc_b
as
exec dbo.sproc_c;
go

create procedure sproc_a
as
SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
SET NOCOUNT ON
SET XACT_ABORT ON
SET ANSI_WARNINGS OFF

declare @transactionName as varchar(50) = '[POC]';
BEGIN TRY
begin tran @transactionName
save tran @transactionName

exec dbo.sproc_b;

commit tran @transactionName
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK;

-- Do some exception handling

-- You'll need to reraise the error to prevent exceptions about inconsistent
-- @@TRANCOUNT before / after execution of the stored proc.
RAISERROR('An error is found', 11, 1);
END CATCH
go

CREATE PROCEDURE [test sproc_a]
AS
-- Assert
BEGIN
EXEC tSQLt.ExpectException
@ExpectedMessage = 'An error is found'
END

-- Act
BEGIN
EXEC dbo.sproc_a
END
GO

EXEC tSQLt.Run '[test sproc_a]'

关于sql - 还有一个回滚错误和 tSQLt.ExpectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30520172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com