我在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
,或者使用其他方法返回错误消息。