python - 如何检索 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()
解决方案
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, )]