首页 > 解决方案 > 如何检索 SQL Server RAISERROR(或 PRINT)消息?

问题描述

我正在尝试使用 PyODBC 从 Python 中的 SQL Server 的 Raiserror 获取警告消息。

严重性是故意低的,因为它充当打印功能,但不必等到查询完成后再打印。

我期望的输出是这样的:

*Test Message*
|col1|
|:-|
|1|

这是我的代码:

import pyodbc

conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=ECH-DWPROD02;DATABASE=Test;Trusted_Connection=yes;')
cursor = conn.cursor()

cursor.execute("SET NOCOUNT ON; RAISERROR('Test Message',0,1) WITH NOWAIT; select 1 as col1")
cursor.fetchall()

标签: pythonsql-serverpython-3.xpyodbc

解决方案


Cursor.messages是 pyodbc(v4.0.31 - 2021 年 7 月)的一个相当新的补充。它允许我们检索从 SQL Server 存储过程等发出的消息。通过打印和 RAISERROR。

请注意,此类消息构成来自服务器的“结果”,因此如果返回它们,则必须调用.nextset()以检索其他结果,否则“先前的 SQL 不是查询”。会出现错误:

crsr.execute("""\
SET NOCOUNT ON; 
RAISERROR('Test Message',0,1) WITH NOWAIT; 
select 1 as col1
""")
print(crsr.messages)
# [('[01000] (50000)', '[Microsoft][ODBC SQL Server Driver][SQL Server]Test Message')]
crsr.nextset()  # required before .fetchall()
print(crsr.fetchall())
# [(1, )]

推荐阅读