繁体   English   中英

带有pyodbc的sql服务器返回值

[英]sql server return value with pyodbc

我正在尝试使用pyodbc运行一些存储的proc并使用以下代码获取单个返回值:

conn = pyodbc.connect("driver={SQL Server};server=MyServer;database=MyDB;trusted_connection=true") 

cursor = conn.cursor()

SQL_command = """
                DECLARE @ret INT

                EXEC @ret = [dbo].proc_mySP             
                  @group= 0
                , @description =?

                SELECT @ret
              """

cursor.execute(SQL_command, description)
retValue = cursor.fetchall()

并且存储过程的框架如下:

-- SOME CODE
-- ......
-- EXEC another_sp
-- DECLARE @RET INT
-- SELECT @RET as retValue
-- ......

上面的sql在sql服务器中工作正常,但是,当上面的Python代码调用它时,它会给出错误消息:

pyodbc.ProgrammingError :(“ 24000”,“ [24000] [Microsoft] [ODBC SQL Server驱动程序]无效的游标状态(0)(SQLNumResultCols)”)

我可以知道我的代码有什么问题吗?

非常感谢。

尝试通过pyodbc运行多语句T-SQL脚本可能会出现问题。 即使这在SSMS中工作正常

DECLARE @tbl AS TABLE (retVal INT);
INSERT INTO @tbl (retVal) 
        EXEC [dbo].proc_mySP
                @group = 37,
                @description = 'foo';
SELECT retVal FROM @tbl;

以下Python代码...

sql = """\
DECLARE @tbl AS TABLE (retVal INT);
INSERT INTO @tbl (retVal) 
        EXEC [dbo].proc_mySP
                @group = 37,
                @description = ?;
SELECT retVal FROM @tbl;
"""
crsr.execute(sql, ['foo'])
row = crsr.fetchone()

...因

pyodbc.ProgrammingError:无结果。 以前的SQL不是查询。

如果存储过程返回带有单列的单行结果集,那么您要做的就是

import pyodbc
cnxn = pyodbc.connect("DSN=myDb_SQLEXPRESS")
crsr = cnxn.cursor()
sql = """\
EXEC [dbo].proc_mySP
        @group = 37,
        @description = ?;
"""
crsr.execute(sql, ['foo'])
the_result = crsr.fetchone()[0]
print(the_result)

通过添加SET NOCOUNT ON在我自己的代码中出现此错误; 作为从Python传递的SQL的第一行。

conn = pyodbc.connect("driver={SQL Server};server=MyServer;database=MyDB;trusted_connection=true") 

cursor = conn.cursor()

SQL_command = """
                SET NOCOUNT ON;
                DECLARE @ret INT

                EXEC @ret = [dbo].proc_mySP             
                  @group= 0
                , @description =?

                SELECT @ret
              """

cursor.execute(SQL_command, description)
retValue = cursor.fetchall()

只需添加“ SET NOCOUNT ON;”即可。 作为过程的第一行,pyodbc将能够在过程结束时从select语句获取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM