我想通过 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 秒。 没有锁定超时,并且该数据库的唯一用户是这个。
在存储过程的顶部放置“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