2017-06-02 64 views
0

我目前正在運行Python 3.4.2和pypyodbc 1.3.6。Python 3和pypyodbc存儲過程錯誤

我想在SQL服務器上運行存儲過程。當我運行沒有需要的參數(日期)的存儲過程時,出現一個錯誤,指出需要一個參數(這是預期的)。

當我在這個日期添加我得到一個錯誤,指出:

遊標狀態無效。

我已經驗證的日期是正確的格式(YYYY-MM-DD),我已經嘗試過多種方法,但每次都得到同樣的錯誤。

下面是我使用的代碼:收到

import pypyodbc as odbc 

connection_string = "DRIVER={SQL SERVER};SERVER=SERVERNAME;DATABASE=DATABASE;Trusted_Connection=yes" 
conn = odbc.connect(connection_string) 
cur = conn.cursor() 
cur.execute("exec stored_procedure '2017-05-01'") 
report_temp = cur.fetchall() 

錯誤:

line 975, in ctrl_err raise ProgrammingError(state,err_text) 
pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]Invalid cursor state') 

任何幫助表示讚賞。

回答

1

確保存儲過程在結果集之前不輸出任何行計數或其他消息。這可能會混淆python驅動程序。 EG這個過程失敗與錯誤代碼

create or alter procedure stored_procedure @date datetime 
as 
begin 
    --set nocount on 
    select * into #t from sys.objects 
    select * from #t 
end 

但在取消對「SET NOCOUNT ON」允許其成功

create or alter procedure stored_procedure @date datetime 
as 
begin 
    set nocount on 
    select * into #t from sys.objects 
    select * from #t 
end 
1

我會強烈建議您在這樣的查詢中使用參數替代,並使用CALL功能來調用存儲過程。試試這樣的代碼:

cur.execute('{CALL stored_procedure(?)}', ('2017-05-01',)) 

有很多原因可能導致24000錯誤失敗。最常見的(正如David Browne所暗示的)在存儲過程中沒有使用SET NOCOUNT ON語句,但返回多個結果集的任何內容也會產生此錯誤。

還有其他的東西可能會產生這個錯誤,例如返回值中的數據元素過大(例如,當您配置爲返回最多8KB的文本時,爲1MB的文本塊)。如果NOCOUNT修補程序不起作用,我們可能還需要查看您的存儲過程。