【问题标题】:Python 3 and pypyodbc stored procedure errorPython 3 和 pypyodbc 存储过程错误
【发布时间】:2017-06-02 15:10:40
【问题描述】:

我目前正在运行 Python 3.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')

感谢任何帮助。

【问题讨论】:

    标签: sql-server python-3.x stored-procedures pypyodbc


    【解决方案1】:

    确保存储过程在结果集之前没有输出任何行数或其他消息。这可能会混淆 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 on”可以让它成功

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

    【讨论】:

      【解决方案2】:

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

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

      这可能失败并出现 24000 错误的原因有很多。最常见的(正如 David Browne 上面提到的)是在存储过程中不使用 SET NOCOUNT ON 语句,但是任何返回多个结果集的东西也会产生这个错误。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2012-06-01
        相关资源
        最近更新 更多