joa*_*inn 4 python sql-server stored-procedures pyodbc
我的问题与stackoverflow/9915788密切相关。
我正在使用 pyodbc 将数据上传到外部 SQL 数据库,为此我使用该数据库的存储过程。该过程返回两件事:
我设法使用上面链接中描述的方法读出了整数值,但我也想读出行集,因为我想在出现任何错误时获取更多信息。
有什么想法如何做到这一点?我不是 SQL 专家,但根据我的理解,行集应该是“类似游标”的对象,因为应该可以循环该行;但我如何在 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()
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得该行,它也应该在某个地方可用。
对于 SQL Server 中的以下存储过程
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
Run Code Online (Sandbox Code Playgroud)
以下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)
Run Code Online (Sandbox Code Playgroud)
印刷
[('Success', )]
[(0, )]
Run Code Online (Sandbox Code Playgroud)
如果我将其更改.execute()为
crsr = cnxn.execute(sql, ("Fred"))
Run Code Online (Sandbox Code Playgroud)
它打印
[('Fail - Fred is not Gord.', )]
[(-1, )]
Run Code Online (Sandbox Code Playgroud)