【问题标题】:How to get the sql print message using pymssql如何使用 pymssql 获取 sql 打印消息
【发布时间】:2017-11-20 16:04:14
【问题描述】:

我正在运行一些查询,从它们的执行中打印运行时统计信息。

通过 print('message') 在 sql 脚本中使用。

我希望在通过 pymssql 调用过程/脚本时看到这些消息。

conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor()
cursor.execute("print('message')")
conn.commit()

上面的脚本没有返回任何内容,我也找不到任何关于如何让该打印显示在控制台输出中的提示。

【问题讨论】:

    标签: python-3.4 pymssql console-output


    【解决方案1】:

    找到了一个解决方案,让我仍然使用 pymssql 并获取打印消息。 pymssql.Connection 实际上在内部使用 _mssql.MSSQLConnection。 这意味着您可以通过访问该内部对象来使用this 示例。

    connection = pymssql.connect(server='server_address', database='db_name')
    connection._conn.set_msghandler(my_msg_handler)  # Install our custom handler
    

    其中 my_msg_handler 与 pmssql wiki 中的对象类型相同。 访问内部对象并不理想,但如果您不想使用不同的库并且需要获取 SQL 打印结果,这是我发现的唯一方法。

    【讨论】:

      【解决方案2】:

      为了在 pymssql 中将某些内容打印到控制台中,您不需要将打印内容放在执行函数中。你可以简单地使用

      print("message")
      

      所以你的代码将是

      conn = pymssql.connect(server, user, password, "tempdb")
      cursor = conn.cursor()
      print("message")
      conn.commit()
      

      【讨论】:

      • 让我换个说法,我在 SQL 中有一个现有的进程,它有打印,我需要在控制台输出中看到这些。
      【解决方案3】:

      我不相信有办法,但你可以重构你的 SQL。例如:

      DECLARE @my_var AS VARCHAR(200)
      PRINT 'Setting a variable...'
      SET @my_var = 'this'
      PRINT 'I am some output'
      SELECT * FROM my_table WHERE this = @my_var
      

      可以重构为这样的:

      DECLARE @my_var AS VARCHAR(200)
      DECLARE @messages AS VARCHAR(MAX)
      SET @messages = @messages + 'Setting a variable...'
      SET @my_var = 'this'
      SET @messages = @messages + 'I am some output'
      SELECT @messages, * FROM my_table WHERE this = @my_var
      

      祝你好运!

      【讨论】:

      • 感谢您的回答,好主意。可悲的是,这是为了支持具有超过 6000 个脚本的数据库的 CI 解决方案,所以....我没有说服任何人重构所有这些 :) 在尝试完成这项工作时,我了解到 _mssql,它是pymssql 包实际上能够返回消息,但在这种情况下,我在使用集成登录时遇到了问题。如果我找到解决方案,我会发布一些信息。
      猜你喜欢
      • 2014-12-27
      • 2010-10-04
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      相关资源
      最近更新 更多