首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python 3和pypyodbc存储过程错误

Python 3和pypyodbc存储过程错误
EN

Stack Overflow用户
提问于 2017-06-02 15:10:40
回答 2查看 1.5K关注 0票数 3

我目前正在运行Python3.4.2和pypyodbc 1.3.6。

我试图在SQL服务器上运行一个存储过程。当我在没有所需参数(日期)的情况下运行存储过程时,我会得到一个错误,说明需要一个参数(这是预期的)。

当我添加此日期时,我会得到一个错误声明:

游标状态无效。

我已经验证了日期是正确的格式,(YYYY-MM-DD)和我尝试了多种方法,但每次都得到相同的错误。

下面是我正在使用的代码:

代码语言:javascript
运行
复制
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()

收到的错误:

代码语言:javascript
运行
复制
line 975, in ctrl_err raise ProgrammingError(state,err_text)
pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]Invalid cursor state')

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2017-06-02 15:43:20

确保存储过程没有在结果集之前输出任何行计数或其他消息。这可能会混淆python驱动程序。这个过程由于代码的错误而失败。

代码语言:javascript
运行
复制
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”的评论,会让它成功

代码语言:javascript
运行
复制
create or alter procedure stored_procedure @date datetime
as
begin
  set nocount on
  select * into #t from sys.objects
  select * from #t
end
票数 5
EN

Stack Overflow用户

发布于 2017-06-02 16:00:55

我强烈建议您在这样的查询中使用参数替换,并使用调用功能来调用存储过程。尝试这样的代码:

代码语言:javascript
运行
复制
cur.execute('{CALL stored_procedure(?)}', ('2017-05-01',))

这可能会导致24000的错误,原因有很多。最常见的(正如上面David所提到的)不是在存储过程中使用SET NOCOUNT ON语句,但是任何返回多个结果集的内容都会生成此错误。

还有其他事情可以生成此错误,例如返回值中的一个超大数据元素(例如,当您被配置为返回最大8KB文本时,一个1MB的文本块)。如果NOCOUNT修复不起作用,我们可能也需要查看您的存储过程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44332150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档