Sql server SQL Server存储过程不会引发异常
我在SQL Server 2017中有一个存储过程,它在表中插入一行:Sql server SQL Server存储过程不会引发异常,sql-server,python-3.6,pyodbc,Sql Server,Python 3.6,Pyodbc,我在SQL Server 2017中有一个存储过程,它在表中插入一行: CREATE PROCEDURE [dbo].[insertsomething] AS BEGIN BEGIN TRY ... #insert statement here END TRY BEGIN CATCH SELECT 'Failed' THROW; END CATCH END 使用pyodbc.execute调用insertsomething过程时,我仅使用光标中的fetchone()函数获得“失
CREATE PROCEDURE [dbo].[insertsomething]
AS
BEGIN
BEGIN TRY
... #insert statement here
END TRY
BEGIN CATCH
SELECT 'Failed'
THROW;
END CATCH
END
使用pyodbc.execute
调用insertsomething
过程时,我仅使用光标中的fetchone()
函数获得“失败”结果
try:
cursor = connection.cursor()
cursor.execute('{CALL dbo.insertsomething (?, ? ...)}', params)
result = cursor.fetchone()[0]
except Exception as e:
raise
调用nextset
不会引发错误。由于第一个结果集,THROW
似乎不会返回错误。是否有任何属性或方法可以调用或使用以引发来自THROW
的错误?我没有修改存储过程的权限,因此我必须在应用程序级别捕获异常。删除选择“失败”
并使用抛出“失败”
。您使用了返回第一个结果的fetchone
。对于当前代码,这就是“失败”
fetchone()
不会检查存储过程是否会抛出错误,我在帖子中说,在我的情况下修改存储过程是不可能的。有没有办法捕获应用程序级别的THROW
语句引发的异常?我已经阅读了pyodbc
文档,但看不到任何可能导致我找到解决方案的内容。您是否尝试过使用nextset()
然后尝试阅读?或者使用fetchall()
?无论如何,问题在于存储过程本身。您只是想为buggyCATCH
语句找到一个变通方法。我怀疑有人将SELECT
添加为“调试”语句,或将PRINT
更改为SELECT
以“打印”结果中的消息,而不是正确处理错误调用nextset()
然后fetchone()
或fetchall()
确实从THROW
语句引发异常。我相信这是一种预期行为,从ODBC文档中了解以下内容>其他几个Transact-SQL语句以消息而不是结果集的形式返回其数据。看起来这是试图为大型作业创建“进度”通知<代码>打印
消息不会出现在结果中,用户必须以与数据库不同的方式请求它们。服务器也不会立即发送它们,它可以对它们进行缓冲,只有在有足够的数据时才发送。