sql server 使用 pyodbc 返回值

Cha*_*ame 5 python sql return-value pyodbc

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

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()
Run Code Online (Sandbox Code Playgroud)

而存储过程的框架如下:

-- SOME CODE
-- ......
-- EXEC another_sp
-- DECLARE @RET INT
-- SELECT @RET as retValue
-- ......
Run Code Online (Sandbox Code Playgroud)

上面的 sql 在 sql server 中运行良好,但是,当它被上面的 Python 代码调用时,它给出了错误消息:

pyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]无效的游标状态 (0) (SQLNumResultCols)')

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

非常感谢。

Gor*_*son 4

尝试通过 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;
Run Code Online (Sandbox Code Playgroud)

以下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()
Run Code Online (Sandbox Code Playgroud)

...失败了

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)
Run Code Online (Sandbox Code Playgroud)