我正在处理每月文件加载的脚本,需要在MS SQL数据库中使用存储过程。
当我通过pyodbc调用存储过程时,它开始执行,但它永远不会完成。我的伪代码如下:
cursor = db.cursor()
cursor.execute({'call stored_procedure'})
cursor.commit()
for n in range(1, 103):
c2 = db.cursor()
c2.execute('select IsFinished from '
'procedure_statuses where '
'procedure_name = "stored_procedure"')
r = c2.fetchone()
if r == True:
c2.close()
break
c2.close()
time.sleep(300)
cursor.close()
procedure_status的StartDate始终在运行开始时更改,但IsFinished永远不会更改,FinishedDate也不会更改。这些字段都在存储过程中更新,如此
update procedure statuses
set IsFinished = 0, StartDate = GETDATE()
where procedure_name = 'stored_procedure'
/* TONS OF STORED PROCEDURE */
update procedure_statuses
set IsFinished = 1, FinishedDate = GETDATE()
where procedure_name = 'stored_procedure'
return
我注意到第二个游标(“选择IsFinished”位)存在一个进程,但不存在活动监视器中的第一个进程。
那么,为什么pyodbc启动存储过程但没有完成呢?
*编辑:还应该注意,这是一个相当大的存储过程。 MSSQL Server内部的执行时间可以持续超过15分钟。如果这是大型存储过程的一个常见问题,我真的搞砸了,因为我还有一个可能需要几个小时才能触发的问题。