2016-02-05 67 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服務器執行存儲過程之前。

相關問題