我有一个python程序,它使用pypyodbc与MSSQL数据库进行交互。存储过程在MSSQL中创建,并通过python运行。如果我只执行一次存储过程(通过python),则没有问题。但是,当它在for循环中多次执行时,我收到以下错误:
pypyodbc.ProgrammingError:('24000','[24000] [Microsoft] [SQL Server Native Client 11.0]无效的游标状态')
我的python代码详细信息如下:
connection_string_prod = 'Driver={SQL Server Native Client 11.0};Server=PSCSQCD1234.TEST.AD.TEST.NET\SQLINS99,2222;Database=Test;Uid=python;Pwd=python;'
connection_prod = pypyodbc.connect(connection_string_prod)
cursor_prod = connection_prod.cursor()
get_files_to_load_query = "Get_Files_To_Load"
files_to_load = cursor_prod.execute(get_files_to_load_query)
for file_name in files_to_load:
load_query = "Load_Query_Stored_Proc @File_Name = '" + file_name + "'"
cursor_prod.execute(load_query)
cursor_prod.commit()
cursor_prod.close()
connection_prod.close()
在某些帖子中,建议在SQL存储过程的顶部使用“SET NOCOUNT ON”。我已经这样做了,这对这个问题没有帮助。
以下是导致此问题的简单存储过程的代码:
CREATE PROCEDURE [dbo].[Test]
AS
SET NOCOUNT ON
INSERT INTO Test(a)
SELECT 1
为什么在for循环中执行存储过程仅会导致问题?
请告知。
谢谢!
答案 0 :(得分:0)
您正在使用cursor_prod
值来控制for
循环,然后在循环中使用相同的游标对象来运行存储过程,从而使以前的状态无效用于控制循环的光标。循环的第一次迭代是光标被覆盖的地方,这就是为什么你不会遇到错误,直到你第二次尝试循环。
您不需要创建第二个连接,但您确实需要使用第二个游标来执行存储过程。或者,您可以使用.fetchall
将所有文件名填充到files_to_load
列表中,然后迭代该列表,释放光标以运行存储过程。 / p>