【问题标题】:Python & SQL Server stored procedure hangPython & SQL Server 存储过程挂起
【发布时间】:2020-06-03 01:44:29
【问题描述】:

我试图让 Python 在我的 SQL Server 中运行一个存储过程,该过程启动一系列过程,其中涉及导入一个文件处理它并输出几个文件。

到目前为止,我已经得到了我的代码,它可以接受对表的输入,但是当它调用存储过程时,整个事情都会挂起。

检查服务器上的Who2,它正在等待preemptive_OS_Pipeops,搜索显示它正在等待SQL Server 之外的某些东西完成,然后再继续。

如果可以使用 pyodbc 盲激活存储过程然后关闭连接,是否有人能够阐明?

我的信念是告诉程序运行然后关闭应该可以解决问题,但我在查找此代码时遇到问题

Python 代码:

    connection2 = pypyodbc.connect('Driver={SQL Server}; Server=server;Database=db', timeout=1)
    cursor2 = connection2.cursor()
    cursor2.execute("{CALL uspGoBabyGo}")
    connection2.close()
    return 'file uploaded successfully'

存储过程:

BEGIN
    SET NOCOUNT ON;

    EXECUTE [dbo].[uspCableMapImport]
END

【问题讨论】:

  • 如果您关闭连接,SP 将停止运行...它需要在连接下运行。您必须调试您的 SP 并找出它挂起的原因。
  • 如消息中所述,SP 由于 Python 调用而挂起,我需要 Python 来启动 SP 然后关闭 Python 不需要进一步的输入 没有输出到 Python SP,为了安全起见,这是我设置它的方式,以便所有 Python 所做的只是将单个值输入到表中,然后启动 SP。 SP 因 Python 而挂起。
  • 您无法关闭连接或将阻止 SP 完成。
  • “SP 因 Python 调用而挂起”——这实际上是什么意思? Python 调用如何影响 SP?
  • 存储过程调用是同步的——在存储过程完成或 (pyodbc?) 语句超时之前,Python 不会继续。如果您希望存储过程启动异步进程,请查看Service Brokers and Queues 或其他解决方案。

标签: python sql-server stored-procedures pyodbc


【解决方案1】:

在搜索并且脚本停止将记录发布到表后,我找到了问题的解决方案。我需要在脚本中添加 autocommit=True 行,现在代码如下;

    connection = pyodbc.connect('Driver={SQL Server}; 
    Server='Server';Database='DB';Trusted_Connection=yes')
    connection.autocommit=True
    cursor = connection.cursor()
    referee = file.filename.rsplit('.')[0]
    SQLCommand = ("INSERT INTO RequestTable(Reference, Requested) VALUES ('"+ str(referee) +"', " + datetime.now().strftime('%Y-%m-%d') + ")")
    cursor.execute(SQLCommand)
    connection.commit
    SQLCommand2 = ("{CALL uspGoBabyGo}")
    cursor.execute(SQLCommand2)
    connection.commit
    connection.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多