存储过程未在 Azure Function 内完全执行

问题描述 投票:0回答:1

我想通过 Azure 函数(HTTP 触发器)调用存储过程。

我能够执行存储过程,但它在流程执行过程中停止,没有任何错误/异常通知。

它实际上在执行过程中随机停止,因为在运行在特定表中插入日志的游标时,我得到不同的输出(有时最后一条日志消息是:“67.LOG MSG”,其他时候是“71.LOG MSG”) ...)

请注意,在 SSMS 内部调用时,具有完全相同参数的完全相同的过程正在成功执行。

对于使用 Azure Functions 和 Azure SQL Server(无服务器计划)的类似问题有什么想法/过去的经验吗?

谢谢

我尝试使用游标在表中插入日志,以确保问题不是来自存储过程中的 T-SQL 代码本身。

用于尝试的光标:

    DECLARE @i INT = 1;

    WHILE @i <= 100
    BEGIN
        DECLARE @logMsg NVARCHAR(50) = CAST(@i AS NVARCHAR(10)) + '. LOG MSG';        
        EXEC etl.usp_insert_log @logMsg;

        SET @i = @i + 1;
    END

我还尝试从Azure函数(它使用pyodbc)捕获错误。 Azure Function 中实际执行存储过程的代码段:

    def execute_non_query(self, query: str, params: list):
        try:
            with self.conn.cursor() as cursor:
                cursor.execute(query, params)
                try:
                    self.conn.commit()
                    logging.info("Non-query executed and committed successfully.")
                except pyodbc.Error as e:
                    logging.error(f"Failed to commit changes due to pyodbc.Error: {e}")
                    raise

        except pyodbc.Error as e:
            logging.error(f"Failed to execute non-query or commit due to pyodbc.Error: {e}")
            raise
        except Exception as e:
            logging.error(f"Failed to execute non-query due to general exception: {e}")
            raise

最后, 绝对没有返回错误,并且执行似乎已完成。 (但事实上不是) Azure函数的超时配置为10分钟,连接字符串的超时也足够高。存储过程的执行时间应少于 1 秒。 没有锁定超时,并且该数据库的唯一用户是这个。

python tsql azure-functions azure-sql-database pyodbc
1个回答
0
投票

在存储过程的顶部放置“SET NOCOUNT ON”

SET NOCOUNT ON

DECLARE @i INT = 1;

WHILE @i <= 100
BEGIN
    DECLARE @logMsg NVARCHAR(50) = CAST(@i AS NVARCHAR(10)) + '. LOG MSG';        
    EXEC etl.usp_insert_log @logMsg;

    SET @i = @i + 1;
END

SET NOCOUNT OFF
© www.soinside.com 2019 - 2024. All rights reserved.