【问题标题】:How to get a SQL Server stored procedure returned rowset using pyodbc?如何使用 pyodbc 获取 SQL Server 存储过程返回的行集?
【发布时间】:2016-02-05 14:50:22
【问题描述】:

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

我正在使用 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()

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

【问题讨论】:

  • 你能告诉我们你尝试了什么
  • 我添加了一个整数值读出的代码示例。对于行读数,我没有具体的想法,非常希望你能给我任何提示......

标签: python sql-server stored-procedures pyodbc


【解决方案1】:

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

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, )]

【讨论】:

  • 感谢 Gord 的精彩回答!我试过了,但问题似乎是 cursor.nextset() 给出了一个布尔值 False,因此我无法调用下一个响应(如果我在调用 nextset() 后尝试 fetchall() 我得到“pyodbc.ProgrammingError: No结果。以前的 SQL 不是查询。”)我将联系数据库管理员并询问该过程如何返回该行;它似乎与您的示例不同,否则我希望它以这种方式工作。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多