Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Python 如何使用pyodbc获取SQL Server存储过程返回的行集?_Python_Sql Server_Stored Procedures_Pyodbc - Fatal编程技术网

Python 如何使用pyodbc获取SQL Server存储过程返回的行集?

Python 如何使用pyodbc获取SQL Server存储过程返回的行集?,python,sql-server,stored-procedures,pyodbc,Python,Sql Server,Stored Procedures,Pyodbc,我的问题与此密切相关 我使用pyodbc将数据上传到外部SQL数据库,为此,我使用该数据库的存储过程。此过程返回两个内容: 行集(如果程序运行正常,则包含文本“Success”的单行,如果程序失败,则包含文本“Fail”后跟任何可用原因的单行) 整数值(0表示成功,1表示失败) 我使用上面链接中描述的方法读取了整数值,但我也想读取行集,因为我想在出现任何错误时获得更多信息 有什么办法吗?我不是SQL专家,但据我所知,行集应该是一个“类似光标”的对象,因为它应该可以循环该行;但是我如何在sel

我的问题与此密切相关

我使用pyodbc将数据上传到外部SQL数据库,为此,我使用该数据库的存储过程。此过程返回两个内容:

  • 行集(如果程序运行正常,则包含文本“Success”的单行,如果程序失败,则包含文本“Fail”后跟任何可用原因的单行)
  • 整数值(0表示成功,1表示失败)
我使用上面链接中描述的方法读取了整数值,但我也想读取行集,因为我想在出现任何错误时获得更多信息

有什么办法吗?我不是SQL专家,但据我所知,行集应该是一个“类似光标”的对象,因为它应该可以循环该行;但是我如何在select语句中得到这个呢

这是我获取整数值的方式:

def CallStoredProc(conn, procName, *args):
    sql = """SET NOCOUNT ON;
            DECLARE @ret int
            EXEC @ret = %s %s
            SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
    return conn.execute(sql, args).fetchall()

但是我不知道如何获取该行,该行也应该在某处可用。

用于SQL Server中的以下存储过程

创建过程[dbo]。[IsItGord]
@p1 varchar(50)=“每个人”
作为
开始
声明@retval int;
不计数;
如果@p1='Gord'
开始
设置@retval=0;
选择“成功”作为响应;
结束
其他的
开始
设置@retval=-1;
选择“失败-”+@p1+“不是Gord.”作为响应;
结束
RETURN@retval;
结束
下面是pyodbc代码

cnxn=pyodbc.connect(connStr)
sql=”“”\
声明@return_value int;
EXEC@return_value=[dbo].[IsItGord]?;
选择“返回值”=@返回值;
"""
crsr=cnxn.execute(sql,(“Gord”))
data=crsr.fetchall()
打印(数据)
crsr.nextset()
data=crsr.fetchall()
打印(数据)
印刷品

[('Success',)]
[(0, )]
如果我将
.execute()
更改为

crsr=cnxn.execute(sql,(“Fred”))
它打印

[('Fail-Fred不是Gord',)]
[(-1, )]

在SQL server中执行存储过程之前,始终使用:将nocount设置为ON。

能否向我们展示您所做的尝试?我添加了一个整数值读数的代码示例。对于这一行,我没有具体的想法,非常希望你能给我任何提示…谢谢Gord给我的好答案!我尝试了这个方法,但问题似乎是cursor.nextset()给出了一个布尔值False,因此我无法调用下一个响应(如果我在调用nextset()后尝试fetchall(),我会得到“pyodbc.ProgrammingError:No results.Previous SQL不是查询”),我将联系数据库管理员,询问该过程如何返回该行;它的工作原理似乎与您的示例不同,否则我希望它能以这种方式工作。