如何使用 pyodbc 获取 SQL 服务器存储过程返回的行集?

How to get a SQL Server stored procedure returned rowset using pyodbc?

我的问题与 Whosebug/9915788 密切相关。

我正在使用 pyodbc 将数据上传到外部 SQL 数据库,为此我使用了该数据库的存储过程。本程序returns两件事:

我设法使用上面 link 中描述的方法读出了整数值,但我也想读出行集,因为我想在出现任何错误时获得更多信息.

有什么办法吗?我不是 SQL 专家,但根据我的理解,行集应该是一个 "cursor like" 对象,因为它应该可以循环该行;但是如何在 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服务器中的以下存储过程

CREATE PROCEDURE [dbo].[IsItGord] 
    @p1 varchar(50) = 'everybody'
AS
BEGIN
    DECLARE @retval int;
    SET NOCOUNT ON;
    IF @p1 = 'Gord'
    BEGIN
        SET @retval = 0;
        SELECT 'Success' AS response;
    END
    ELSE
    BEGIN
        SET @retval = -1;
        SELECT 'Fail - ' + @p1 + ' is not Gord.' AS response;
    END
    RETURN @retval;
END

以下pyodbc代码

cnxn = pyodbc.connect(connStr)
sql = """\
DECLARE @return_value int;
EXEC    @return_value = [dbo].[IsItGord] ?;
SELECT  'Return Value' = @return_value;
"""
crsr = cnxn.execute(sql, ("Gord"))
data = crsr.fetchall()
print(data)
crsr.nextset()
data = crsr.fetchall()
print(data)

打印

[('Success', )]
[(0, )]

如果我将 .execute() 更改为

crsr = cnxn.execute(sql, ("Fred"))

它打印

[('Fail - Fred is not Gord.', )]
[(-1, )]

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