MSSQL存储过程退出而没有使用pyodbc完全执行

时间:2018-04-23 09:40:41

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

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

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

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

仅当存储过程需要很长的执行时间时才会发生此问题。

为什么会这样? pyodbc方是否有任何限制? 或者来自mssql server end的任何限制?

代码段如下: -

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可以避免打印/更新/插入语句。

1 个答案:

答案 0 :(得分:2)

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

<强>分离

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

从程序中获取更多信息

  1. 将错误检查添加到MS SQL Server过程,以便进行任何错误 遇到的是记录在表中 - 可能会抛出错误 由于某种原因你没有被你的pyodbc代码拿起。
  2. 从过程中添加某种日志记录,以便您可以看到 它到底在哪里,以及每一步都需要多长时间。
  3. 如果您熟悉它,我建议您使用SQL Server探查器,但如果在测试环境中不能轻易重复该问题,那么这可能不是一个选项(如果您保持运行时间过长,你得到的信息太多了。)

    调用代码时的错误处理

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

    <强>超时

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