gpt4 book ai didi

python - 从 Python 调用时 SQL 存储过程未完成

转载 作者:行者123 更新时间:2023-11-28 17:11:19 24 4
gpt4 key购买 nike

我试图从 python 脚本调用我的 MSSQL 数据库中的存储过程,但是当通过 python 调用时它没有完全运行。此过程将交易数据合并到单个表中的小时/每日 block 中,稍后由 python 脚本获取。如果我在 SQL Studio 中运行该过程,它会很好地完成。

当我通过我的脚本运行它时,它在大约 2/3 的过程中被截断了。目前我找到了一个解决方法,让程序在继续执行下一个 SQL 语句之前休眠 10 秒,但是这不是时间有效且不可靠的方法,因为某些过程可能无法在那个时间内完成。我正在寻找一种更优雅的方式来实现它。

当前代码:

cursor.execute("execute mySP")
time.sleep(10)
cursor.commit()

我能找到的与我的问题最相关的文章在这里: make python wait for stored procedure to finish executing

我尝试了使用 Tornado 和 I/O 生成器的解决方案,但遇到了文章中列出的相同问题,该问题从未得到解决。我还尝试了接受的解决方案,通过我的存储过程在数据库中设置一个 runningstatus 字段。在我的 SP Status 开始时,RunningStatus 中的状态更新为 1,当 SP 完成时,RunningStatus 中的 Status 更新为 0。然后我实现了以下 python 代码:

    conn=pyodbc_connect(conn_str)
cursor=conn.cursor()
sconn=pyodbc_connect(conn_str)
scursor=sconn.cursor()

cursor.execute("execute mySP")
cursor.commit()
while 1:
q=scursor.execute("SELECT Status FROM RunningStatus").fetchone()
if(q[0]==0):
break

当我实现这个时,同样的问题发生在我的存储过程在它实际完成之前完成执行。如果我删除我的 cursor.commit(),如下所示,我最终会无限期挂起连接,直到我终止 python 进程。

    conn=pyodbc_connect(conn_str)
cursor=conn.cursor()
sconn=pyodbc_connect(conn_str)
scursor=sconn.cursor()

cursor.execute("execute mySP")
while 1:
q=scursor.execute("SELECT Status FROM RunningStatus").fetchone()
if(q[0]==0):
break

任何帮助寻找更有效和可靠的方法来实现这一点,而不是 time.sleep(10) 将不胜感激。

最佳答案

正如 OP 所发现的,从应用层(如 Python)处理存储过程的不一致或不完整可能是由于偏离了 TSQL 脚本的最佳实践。

作为@AaronBetrand本期亮点Stored Procedures Best Practices Checklist博客,请考虑以下事项:

  • 明确和自由地使用 BEGIN ... END block ;
  • 使用 SET NOCOUNT ON 避免为受影响的每一行操作向客户端发送消息,这可能会中断工作流程;
  • 使用分号作为语句终止符。

例子

CREATE PROCEDURE dbo.myStoredProc
AS
BEGIN
SET NOCOUNT ON;

SELECT * FROM foo;

SELECT * FROM bar;
END
GO

关于python - 从 Python 调用时 SQL 存储过程未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com