Python 使用pyodbc的sql server返回值

Python 使用pyodbc的sql server返回值,python,sql,return-value,pyodbc,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].p

我正在尝试使用
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()
存储过程的框架如下所示:

-- SOME CODE
-- ......
-- EXEC another_sp
-- DECLARE @RET INT
-- SELECT @RET as retValue
-- ......
上面的sql在sql server中运行良好,但是,当上面的Python代码调用它时,它会给出错误消息:

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

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


非常感谢。

尝试通过pyodbc运行多语句T-SQL脚本可能会有问题。即使这在SSMS中运行良好

将@tbl声明为表(retVal INT);
插入@tbl(retVal)
EXEC[dbo].proc_mySP
@组=37,
@description='foo';
从@tbl中选择retVal;
下面的Python代码

sql=”“”\
将@tbl声明为表(retVal INT);
插入@tbl(retVal)
EXEC[dbo].proc_mySP
@组=37,
@描述=?;
从@tbl中选择retVal;
"""
crsr.execute(sql,['foo'])
row=crsr.fetchone()
。。。失败于

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

如果存储过程返回一个包含一列的单行结果集,则只需

导入pyodbc
cnxn=pyodbc.connect(“DSN=myDb\u SQLEXPRESS”)
crsr=cnxn.cursor()
sql=”“”\
EXEC[dbo].proc_mySP
@组=37,
@描述=?;
"""
crsr.execute(sql,['foo'])
_result=crsr.fetchone()[0]
打印(结果)

我在自己的代码中添加了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()

只需添加“setnocounton;”作为过程的第一行,pyodbc就可以从过程末尾的select语句中获取数据

不要认为这回答了问题。抑制受影响的
N行
消息,它不会影响存储过程结果集、返回代码或输出参数。实际上是这样。我很清楚它在SSMS内部的作用。但是,当从Python连接到MSSQL并运行多个SQL语句时,使用该代码可以使Python接受结果。您可能应该在声明错误之前进行测试,因为我在多种语言中多次遇到并修复了此问题。从Python、R和VBA运行多行tsql时,必须启用NOCOUNT。否则,你会在这三个问题中遇到不同的、毫无帮助的错误。令人难以置信的是,人们在没有测试的情况下否决了我的答案。Gord给出的上述答案很好,但我的答案要好得多,因为他的答案只适用于获得一行,而我的答案适用于所有多行tsql。希望在测试结束后,能听到投票人的回复。请提供更多关于您的解决方案的详细信息,而不是一句话。其中,
设置无计数为ON应包含在问题源代码中?