当前位置: 首页 > 面试题库 >

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

楚勇
2023-03-14
问题内容

我正在尝试从python脚本调用我的MSSQL数据库中的存储过程,但是通过python调用时它无法完全运行。此过程将交易数据合并到单个表中的小时/每日块中,稍后由python脚本抓取。如果我在SQL
Studio中运行该过程,则可以正常完成。

当我通过脚本运行它时,它会缩短大约2/3的时间。目前,我已经找到一种解决方法,方法是使程序在进入下一个SQL语句之前先休眠10秒钟,但是这样做并不省时且不可靠,因为某些过程可能无法在此时间内完成。我正在寻找一种更优雅的方法来实现这一目标。

当前代码:

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

我可以找到与我的问题最相关的文章在这里:
使python等待存储过程完成执行

我使用Tornado和I /
O生成器尝试了该解决方案,但是遇到了与本文中列出的问题相同的问题,但从未解决过。我还尝试了接受的解决方案,以通过存储过程在数据库中设置runningstatus字段。在开始时,我的SP状态在RunningStatus中更新为1,并且当SP完成时,状态在RunningStatus中更新为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在此“存储过程最佳做法清单”博客中所强调的那样,请考虑以下事项:

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

例子

CREATE PROCEDURE dbo.myStoredProc
AS
BEGIN
   SET NOCOUNT ON;

   SELECT * FROM foo;

   SELECT * FROM bar;
END
GO


 类似资料:
  • 我在SAP HANA中定义了一个存储过程,其中包含3个in参数,返回一个记录集。当我用语法调用它时,它在HANA studio中运行得非常好。 现在我需要从微软SQL服务器调用它(我在2016年)。我有一个与HANA服务器的远程链接服务器连接,当使用和语法查询表和视图时,它可以正常工作。 我尽力了,但找不到调用远程过程的方法。“CALL sp_name(p,p,p)”语法返回“对象没有列或当前用户

  • 本文向大家介绍SQL SERVER调用存储过程小结,包括了SQL SERVER调用存储过程小结的使用技巧和注意事项,需要的朋友参考一下 在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法 一、SQL SERVER中调用不带输出参数的存储过程 SQL 代码 二、SQL SERVER中调用带输出参数的存储过程 SQL

  • 问题内容: 是否允许在SQL CTE语句中执行存储过程?我对sql cte查询有点陌生… 问题答案: 不,对不起 仅SELECT语句 如果您需要使用存储的proc输出(结果集),那么它将是一个临时表

  • 问题内容: 我正在编写一个简单的Web应用程序以调用存储过程并检索一些数据。它是一个非常简单的应用程序,可以与客户的数据库进行交互。我们传递员工ID和公司ID,存储过程将返回员工详细信息。 Web应用程序无法更新/删除数据,并且正在使用SQL Server。 我正在Jboss AS中部署Web应用程序。我应该使用JPA访问存储过程还是。在这种情况下使用JPA的任何优势。 调用该存储过程的sql语句

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’