如何使用 pyodbc 获取 SQL 服务器存储过程返回的行集?
How to get a SQL Server stored procedure returned rowset using pyodbc?
我的问题与 Whosebug/9915788 密切相关。
我正在使用 pyodbc 将数据上传到外部 SQL 数据库,为此我使用了该数据库的存储过程。本程序returns两件事:
- 一个行集(单行包含文本 "Success" 如果程序运行良好,或者文本 "Fail" 后跟任何可用的原因,如果失败)
- 一个整数值(0代表成功,-1代表失败)
我设法使用上面 link 中描述的方法读出了整数值,但我也想读出行集,因为我想在出现任何错误时获得更多信息.
有什么办法吗?我不是 SQL 专家,但根据我的理解,行集应该是一个 "cursor like" 对象,因为它应该可以循环该行;但是如何在 select 语句中得到它?
这是我获取整数值的方式:
def CallStoredProc(conn, procName, *args):
sql = """SET NOCOUNT ON;
DECLARE @ret int
EXEC @ret = %s %s
SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
return conn.execute(sql, args).fetchall()
但我不知道如何获取该行,该行应该也可以在某个地方使用..
对于SQL服务器中的以下存储过程
CREATE PROCEDURE [dbo].[IsItGord]
@p1 varchar(50) = 'everybody'
AS
BEGIN
DECLARE @retval int;
SET NOCOUNT ON;
IF @p1 = 'Gord'
BEGIN
SET @retval = 0;
SELECT 'Success' AS response;
END
ELSE
BEGIN
SET @retval = -1;
SELECT 'Fail - ' + @p1 + ' is not Gord.' AS response;
END
RETURN @retval;
END
以下pyodbc代码
cnxn = pyodbc.connect(connStr)
sql = """\
DECLARE @return_value int;
EXEC @return_value = [dbo].[IsItGord] ?;
SELECT 'Return Value' = @return_value;
"""
crsr = cnxn.execute(sql, ("Gord"))
data = crsr.fetchall()
print(data)
crsr.nextset()
data = crsr.fetchall()
print(data)
打印
[('Success', )]
[(0, )]
如果我将 .execute()
更改为
crsr = cnxn.execute(sql, ("Fred"))
它打印
[('Fail - Fred is not Gord.', )]
[(-1, )]
始终使用:在 SQL 服务器中执行存储过程之前,将 nocount 设置为 ON。
我的问题与 Whosebug/9915788 密切相关。
我正在使用 pyodbc 将数据上传到外部 SQL 数据库,为此我使用了该数据库的存储过程。本程序returns两件事:
- 一个行集(单行包含文本 "Success" 如果程序运行良好,或者文本 "Fail" 后跟任何可用的原因,如果失败)
- 一个整数值(0代表成功,-1代表失败)
我设法使用上面 link 中描述的方法读出了整数值,但我也想读出行集,因为我想在出现任何错误时获得更多信息.
有什么办法吗?我不是 SQL 专家,但根据我的理解,行集应该是一个 "cursor like" 对象,因为它应该可以循环该行;但是如何在 select 语句中得到它?
这是我获取整数值的方式:
def CallStoredProc(conn, procName, *args):
sql = """SET NOCOUNT ON;
DECLARE @ret int
EXEC @ret = %s %s
SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
return conn.execute(sql, args).fetchall()
但我不知道如何获取该行,该行应该也可以在某个地方使用..
对于SQL服务器中的以下存储过程
CREATE PROCEDURE [dbo].[IsItGord]
@p1 varchar(50) = 'everybody'
AS
BEGIN
DECLARE @retval int;
SET NOCOUNT ON;
IF @p1 = 'Gord'
BEGIN
SET @retval = 0;
SELECT 'Success' AS response;
END
ELSE
BEGIN
SET @retval = -1;
SELECT 'Fail - ' + @p1 + ' is not Gord.' AS response;
END
RETURN @retval;
END
以下pyodbc代码
cnxn = pyodbc.connect(connStr)
sql = """\
DECLARE @return_value int;
EXEC @return_value = [dbo].[IsItGord] ?;
SELECT 'Return Value' = @return_value;
"""
crsr = cnxn.execute(sql, ("Gord"))
data = crsr.fetchall()
print(data)
crsr.nextset()
data = crsr.fetchall()
print(data)
打印
[('Success', )]
[(0, )]
如果我将 .execute()
更改为
crsr = cnxn.execute(sql, ("Fred"))
它打印
[('Fail - Fred is not Gord.', )]
[(-1, )]
始终使用:在 SQL 服务器中执行存储过程之前,将 nocount 设置为 ON。