使用PYODBC中的THROW逻辑调用T-SQL存储过程会回滚



我在PYODBC中遇到了一些奇怪的行为。我在SQL中有一个非常简单的存储过程,它可以执行以下操作:

CREATE PROCEDURE [schema].[procname]
(
@severity       VARCHAR(1) = 'I',
@LogMessage     VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO [schema].[table]
(col1
,col2)
VALUES
(@severity
,@LogMessage
)
IF @severity IN ('E','F')
BEGIN;
THROW 320000, @msg, 1
END
END
GO

正如您所看到的,传递给参数的任何内容都只是插入到一个表中。每当@serity为'E'或'F'时,它都应该抛出一个错误(插入后(。

现在,只需调用SQLServerManagementStudio中的过程即可正常工作:

EXEC [schema].[procname] @severity='E', @LogMessage = 'XYZ'

它将返回一个错误,但已插入记录。

但是每当我从PYODBC调用过程时:

pyodbc_cursor.execute(f"EXEC [schema].[procname] @severity='E', @LogMessage = 'XYZ'")
pyodbc_cursor.commit() 

我只得到错误,记录没有插入。

我无法解释这种行为。有人知道可能出了什么问题吗?

提前感谢!

您不应该使用throw从存储过程传递回信息,如果这是您想要的,那么让过程返回这样的信息,例如

IF @severity IN ('E','F')
BEGIN
--THROW 320000, @msg, 1
select @msg as result
END
else
begin
select 'no errors' as result
end

然后在调用后读取过程的结果。
然后,如果您whish这样,您仍然可以在python代码中抛出异常

Python使用autocommit=false,因此驱动程序将执行SET IMPLICIT_TRANSACTIONS ON;。这意味着默认情况下,整个批次都在事务中。当您抛出一个错误时,它会被回滚,从而删除插入。

在连接设置中设置autocommit=true,或者使用其他方法返回错误消息。

相关内容

  • 没有找到相关文章

最新更新