Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server存储过程不会引发异常_Sql Server_Python 3.6_Pyodbc - Fatal编程技术网

Sql server SQL Server存储过程不会引发异常

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()函数获得“失

我在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()
函数获得“失败”结果

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()
?无论如何,问题在于存储过程本身。您只是想为buggy
CATCH
语句找到一个变通方法。我怀疑有人将
SELECT
添加为“调试”语句,或将
PRINT
更改为
SELECT
以“打印”结果中的消息,而不是正确处理错误调用
nextset()
然后
fetchone()
fetchall()
确实从
THROW
语句引发异常。我相信这是一种预期行为,从ODBC文档中了解以下内容>其他几个Transact-SQL语句以消息而不是结果集的形式返回其数据。看起来这是试图为大型作业创建“进度”通知<代码>打印
消息不会出现在结果中,用户必须以与数据库不同的方式请求它们。服务器也不会立即发送它们,它可以对它们进行缓冲,只有在有足够的数据时才发送。