【问题标题】:MSSQL Stored procedure exits without full execution using pyodbcMSSQL 存储过程退出而没有使用 pyodbc 完全执行
【发布时间】:2018-04-23 09:40:40
【问题描述】:

我正在使用 python(3.6) 的 pyodbc 模块执行 MSSQL stored procedure。如果我的存储过程的执行时间超过 4 分钟,它会从那里静默退出而不会出现任何错误。

我将远程连接超时设置为零(这意味着无限超时)。

问题是它没有抛出任何错误/异常,所以我无法追踪它。

仅当存储过程执行时间较长时才会出现此问题。

为什么会这样? pyodbc 方面有什么限制吗? 还是来自 mssql 服务器端的任何限制?

代码 sn-p 如下:-

conn = pyodbc.connect("Driver={SQL Server Native Client 10.0};Server=myserver;Databse=mydb;Trusted_Connection=True")
sql = """
    declare @cnt int=1
    while @cnt < 100
    begin
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')
        print('dummy message')


        insert into table1 values (@cnt)
        set @cnt = @cnt + 1
    end
    "
result = conn.execute(sql)
print(result.fetchall())

如果有许多语句正在执行或有许多打印语句,则存储过程只是简单地退出而没有任何错误。 通过设置我已经尝试过的SET NOCOUNT ON,可以避免打印/更新/插入语句。

【问题讨论】:

  • 请包含您的代码,尤其是 pyodbc 连接字符串。最好知道您从哪个操作系统连接、您使用的驱动程序以及您使用的任何配置文件(例如odbc.inifreetds.conf)。
  • @FlipperPA 添加了示例代码

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


【解决方案1】:

如果没有看到代码,很难给你有针对性的建议,所以这是一个非常笼统的答案,但希望它能帮助你指明正确的方向。

分离

当您在两个部分(MS SQL Server 和 pyodbc)一起工作时遇到无法解释的问题时,可能很难确定哪个部分存在问题。我建议您专注于从 MS SQL Server 部分获取更多信息。

从程序中获取更多信息

  1. 将错误检查添加到 MS SQL Server 过程,以便任何错误 遇到的记录在表中 - 可能会抛出错误 由于某种原因,您的 pyodbc 代码没有接收到它。
  2. 在过程中添加某种日志记录,这样您就可以看到 确切的位置,以及完成每个步骤所需的时间。

如果您熟悉 SQL Server 探查器,我还建议您使用它,但如果在测试环境中无法轻松重复该问题(如果您让该问题运行时间过长),这可能不是一个选项你得到的信息太多了)。

调用代码中的错误处理

如果数据库部分中的所有内容都已检查,请尝试从调用代码中获取更多信息。 同样,添加更多错误处理和调试代码以准确找出故障点在哪里。 为了确认您的代码设置正确以处理错误,故意在您的存储过程中编写错误代码(除以零很容易创建)并确保调用代码处理错误。您可能会发现您正在检查错误的返回代码或其他内容,这就是您的调用代码未检测到任何问题的原因。

超时

MS SQL Server 中有多个超时设置 - 它们可以通过代码或连接字符串进行设置。 连接超时设置:15 秒 命令/查询超时设置:30 秒 但这只是数据库超时。您的应用程序也可能有超时。例如,HTML 响应有超时来处理空闲连接(408 请求超时),一些服务器在不发送任何消息的情况下终止连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多