pypyodbc - 在循环中执行存储过程时无效的游标状态

时间:2017-01-05 16:31:33

标签: python sql-server pypyodbc

我有一个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循环中执行存储过程会导致问题?

请告知。

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在使用cursor_prod值来控制for循环,然后在循环中使用相同的游标对象来运行存储过程,从而使以前的状态无效用于控制循环的光标。循环的第一次迭代是光标被覆盖的地方,这就是为什么你不会遇到错误,直到你第二次尝试循环。

您不需要创建第二个连接,但您确实需要使用第二个游标来执行存储过程。或者,您可以使用.fetchall将所有文件名填充到files_to_load 列表中,然后迭代该列表,释放光标以运行存储过程。 / p>