【问题标题】:Run SQL 'Kill' from Python从 Python 运行 SQL 'Kill'
【发布时间】:2018-12-29 21:19:31
【问题描述】:

我总是通过 pymssql 从 Python 上的 SQL 数据库中检索数据,这可能导致空闲连接过多。因此,我编写了一个 SQL 过程来终止空闲连接,并且当我在 SSMS 上执行时它可以工作。但是,当我尝试在 python 上执行它时,它会失败并引发:

(6115, b'KILL 命令不能在用户事务中使用。DB-Lib 错误消息 20018,严重性 16:\n一般 SQL Server 错误:检查 来自 SQL Server 的消息\n')

以下代码是从python执行SQL过程的方法,

import pymssql

conn = pymssql.connect(server, username, password, dbname)
cursor = conn.cursor()

cursor.execute("exec killconn")

我该如何处理?

非常感谢。

【问题讨论】:

  • 这是我找到的一个案例,但我仍然很困惑如何处理它。 sql-server-performance.com/2007/…
  • 在黑暗中拍摄(可能未命中) 这不是连接对象的权限升级,所以不允许吗?还是您在两个地方都使用相同的用户名/密码?
  • 为什么你的程序没有关闭和破坏它的连接?解决根本原因,而不是症状。
  • @scsimon 是的,这是一种方式。谢谢。
  • @alroc 说了什么。通过关闭和处理连接对象来修复糟糕的代码,问题将不再困扰您。

标签: python sql-server


【解决方案1】:

这可能不是空闲连接的根本问题的解决方案,但来自 SQL Server 的错误是由 pymssql 默认将每个连接包装在事务中引起的。诸如 KILL 之类的命令不能在事务中运行,因此如果以这种方式调用,则会失败。

为防止 pymssql 或其他 python 数据库连接添加此事务,autocommit 可以设置为 True。

由于它是一个被调用的存储过程,callproc() 可能比execute() 更合适。

import pymssql

conn = pymssql.connect(server, username, password, dbname)

conn.autocommit(True)

cursor = conn.cursor()

cursor.callproc("killconn")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 2017-07-30
    • 1970-01-01
    • 2013-12-02
    • 2015-01-19
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多