2016-02-05 36 views
3

我的问题与stackoverflow/9915788密切相关。如何获取SQL Server存储过程返回的行集使用pyodbc?

我正在使用pyodbc上传数据到外部SQL数据库,为此我使用该数据库的存储过程。此过程返回两件事情:

  • 行集(单行其中包含文本“成功”如果程序能正常工作或文本“失败”,后跟任何可用的理由,如果它失败)
  • 整数值(0为成功,-1为失败)

我设法读出整数值使用上面的链接中描述的方法,但我想读出行集,以及因为我想在出现任何错误的情况下获得更多信息。

任何想法如何做到这一点?我不是SQL专家,但在我的理解中,行集应该是“光标像”对象,因为它应该可以循环该行;但是我怎么在选择语句中得到这个呢?

这是我得到的整数值:

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() 

但我不知道如何让行,这也应该是可以拿到..

+0

你能告诉我们你试过的吗 –

+0

我加了一个整数值读出的代码示例。对于行读出我没有具体的想法,并绝望地希望你能给我任何提示... – joaquinn

回答

2

对于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,)] 
+0

谢谢戈德你的不错的答案! 我想这一点,但问题似乎是在cursor.nextset()给出了一个布尔值false,所以我不能把下一个响应(如果我尝试调用nextset后使用fetchall()()我得到“pyodbc.ProgrammingError:没有结果以前SQL不是查询“) 我会联系数据库管理员,并要求该过程如何返回行。它似乎工作不同于你的例子,否则我会期望它以这种方式工作。 – joaquinn

0

始终使用:SET NOCOUNT ON,在SQL服务器执行存储过程之前。

相关问题