Azure Synapse Lookup Activity调用存储过程删记录异常求助
Lookup活动的结果集要求:Azure Synapse的Lookup活动需要获取返回结果集才能正常走完执行流程。如果你的Lookup仅调用
CALL deleteSPrecords();而未附加SELECT 1 AS output;,Synapse可能因未拿到结果集直接终止执行(表现为瞬间完成),但存储过程的事务并未提交。手动执行时你加了SELECT语句,确保事务完成,所以删除生效。建议把Lookup的SQL脚本改成和你手动执行的一致,带上返回结果的语句。存储过程的事务控制:检查PostgreSQL存储过程内部是否有显式事务逻辑(比如
BEGIN/COMMIT)。如果存储过程依赖外部提交事务,而Synapse Lookup的连接默认未开启自动提交,就会导致修改被回滚。手动执行时你的客户端可能开启了自动提交,所以修改生效。可以在存储过程末尾添加COMMIT;(无内部事务时),或者在Synapse的连接配置里开启自动提交。会话环境不一致:Synapse调用存储过程的会话环境(比如
search_path、时区、会话变量)和你手动执行时可能不同。如果存储过程的删除逻辑依赖这些环境变量,就会出现时灵时不灵的情况。比如存储过程里用了未指定schema的表名,Synapse会话的search_path没包含目标schema,导致找不到表;或者依赖的会话变量在Synapse会话里未初始化。可以在存储过程开头显式设置必要的环境参数,或者在Lookup的SQL脚本开头加上环境配置语句(比如SET search_path TO your_schema;)。并发锁或数据冲突:如果有其他进程同时操作目标表,存储过程的删除语句可能因锁等待或PostgreSQL的MVCC机制,匹配不到要删除的记录。手动执行时可能无并发冲突,所以能成功;Synapse调度执行时刚好遇到并发,就删除0条记录。可以在存储过程里加日志逻辑(比如插入操作日志表),记录每次执行的删除行数,排查是否是数据匹配问题。
Synapse Lookup的执行限制:Lookup活动默认是单次查询模式,如果存储过程包含循环或批量处理逻辑,可能因Synapse的执行限制未完全执行。可以查看PostgreSQL的执行日志,确认每次调用是否完整执行了删除逻辑。
内容的提问来源于stack exchange,提问作者user15382501

