【问题标题】:sql print statements from pyodbc来自pyodbc的sql打印语句
【发布时间】:2012-12-13 02:12:06
【问题描述】:

如何从sql_query 获取输出?

import pyodbc

sql_query = "print 'Hello World'"

conn = pyodbc.connect("DRIVER={SQL Server};
SERVER=myserver;
DATABASE=mydatabase;
UID=myusername;
PWD=mypassword")

cur = conn.cursor()

cur.execute(sql_query)
cur.commit()

for row in cursor.fetchall():
    print row

到目前为止,我认为 SQL 打印与通常的结构化响应相比超出范围

http://www.easysoft.com/developer/languages/perl/sql_server_unix_tutorial.html#print_statement_status_messages 与我在 Perl 中尝试做的类似。

我能看到的最接近的是可选的: http://www.python.org/dev/peps/pep-0249/#cursor-messages所以我猜它只是没有实现?

【问题讨论】:

  • 在 TDS 级别。 PRINT 和 RAISERROR() 都与结果集一起发送“带内”查询输出。但是,数据不是 TDS 结果集,而且驱动程序似乎没有正确处理它。

标签: sql-server tsql pyodbc python-db-api


【解决方案1】:

运行查询 PRINT 'Hello World' 时,输出将作为控制台输出(字符串)返回,而 fetchall 正在查看查询的结果集(对象)。 RAISERROR 是一个错误条件,可以停止进程。我并不是说这不是一个解决方案,但也许您只是想打印一些反馈而不创建错误条件。

我认为你可以通过改变来达到你想要的结果

[PRINT 'Hello World'] 到 [SELECT 'Hello World']

我认为这将在结果集中创建一行数据,其中包含您想要的文本,这些数据应该显示在 fetchall 中,并查看您是否获得了预期的结果。

希望能提供您可以尝试的替代方案!

【讨论】:

    【解决方案2】:

    在 PRINT 上使用 RAISERROR。与NOWAIT 一起使用可立即获得输出。我不知道如何在 python 中处理这个问题,但是在 ADO.NET 中,您可以在 SqlConnection 上使用InfoMessage 事件。也许 Python 中也有类似的东西。

    【讨论】: