gpt4 book ai didi

python - Python 中的错误 "Previous SQL was not a query"?

转载 作者:太空狗 更新时间:2023-10-30 00:29:13 26 4
gpt4 key购买 nike

我试图在 Python 中调用一个存储过程,但它一直给我以下错误。该过程是用 SQL Server 2008 编写的,我正在使用 PyODBC 调用该方法并将参数传递给它。

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+serveripaddr+';DATABASE='+database+';UID='+userid+';PWD='+password+'')
cursor = cnxn.cursor()
cursor.execute("{call p_GetTransactionsStats('KENYA', '41')}")
rows = cursor.fetchall()

最后一行导致以下异常:

ProgrammingError: No results.  Previous SQL was not a query.

这可能是什么问题?

最佳答案

事情是这样的。存储过程包含几个步骤。当它从 SQL Server Management Studio 执行时,很容易看到每个步骤如何产生一条单独的消息,例如 “(3 row(s) affected)”,并且只有最后一步产生响应。

显然,当通过 pyodbc 游标调用时,这些单独的步骤中的每一个都会产生一个单独的 resultset,其中所有结果集(但最后一个结果集)不包含任何数据可以通过 fetchall() 读取。

因此,解决该问题的一种选择是使用 nextset() 遍历这些结果集,直到找到确实产生结果的结果集,例如:

while cursor.nextset():   # NB: This always skips the first resultset
try:
results = cursor.fetchall()
break
except pyodbc.ProgrammingError:
continue

如另一个答案中所述,更好的选择是使用 SET NOCOUNT ON; 指令,这似乎可以防止所有中间的空 (# rows affected) 结果集。该指令可以简单地添加到 proc 调用之前,例如:

cursor.execute("set nocount on; exec MyStoredProc ?", some_parameter)
results = cursor.fetchall()

关于python - Python 中的错误 "Previous SQL was not a query"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41302866/

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