2017-06-02 98 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修补程序不起作用,我们可能还需要查看您的存储过程。