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代码>应包含在问题源代码中?