我目前正在运行Python3.4.2和pypyodbc 1.3.6。
我试图在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')
任何帮助都是非常感谢的。
发布于 2017-06-02 15:43:20
确保存储过程没有在结果集之前输出任何行计数或其他消息。这可能会混淆python驱动程序。这个过程由于代码的错误而失败。
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”的评论,会让它成功
create or alter procedure stored_procedure @date datetime
as
begin
set nocount on
select * into #t from sys.objects
select * from #t
end
发布于 2017-06-02 16:00:55
我强烈建议您在这样的查询中使用参数替换,并使用调用功能来调用存储过程。尝试这样的代码:
cur.execute('{CALL stored_procedure(?)}', ('2017-05-01',))
这可能会导致24000的错误,原因有很多。最常见的(正如上面David所提到的)不是在存储过程中使用SET NOCOUNT ON
语句,但是任何返回多个结果集的内容都会生成此错误。
还有其他事情可以生成此错误,例如返回值中的一个超大数据元素(例如,当您被配置为返回最大8KB文本时,一个1MB的文本块)。如果NOCOUNT修复不起作用,我们可能也需要查看您的存储过程。
https://stackoverflow.com/questions/44332150
复制相似问题