You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter4执行MSSQL批量upsert查询仅最多处理141条记录问题求助

故障可能原因
  • PHP运行时超时:php.ini中max_execution_time配置默认多为30秒,游标逐行处理数据的效率极低,处理141条的耗时刚好达到超时阈值,脚本被PHP强制终止。SQL管理工具不受PHP运行时限制,因此可正常跑完所有数据。
  • 查询超时设置过短:CodeIgniter数据库配置中的query_timeout参数、或所用MSSQL驱动的默认查询超时时间设置过小,执行到141条时触发超时断开连接。SQL管理工具的查询超时阈值通常更高甚至无限制,不会触发该问题。
  • JSON字符串被截断:你动态生成的SQL中@json变量存储上万条记录的JSON数组,若PHP或MSSQL驱动默认限制了单次传递的字符串最大长度,超出部分会被截断,OPENJSON仅能解析到前141条有效数据,后续JSON格式错误导致执行终止。你手动复制完整SQL到管理工具运行,自然不会出现截断问题。
  • 多结果集阻塞:你编写的SQL中每条INSERT、UPDATE操作都会返回独立的受影响行数结果集,CodeIgniter的$this->db->query()方法默认只会处理第一个结果集,未消费的结果集堆积会导致连接阻塞,执行到一定数量后自动终止。SQL管理工具会自动处理所有结果集,因此可正常执行。
优化建议
  • 替换游标逐行处理逻辑,改用MSSQL原生MERGE语句实现批量upsert,执行效率可提升数十倍,从根源规避超时问题
  • 按需调整max_execution_time、数据库查询超时等参数,延长允许的执行时长
  • 检查MSSQL驱动配置,放开字符串传递长度限制,避免JSON被截断
  • 执行多结果集查询时,手动调用驱动方法消费所有结果集,避免连接阻塞

内容的提问来源于stack exchange,提问作者Yakup EYİSAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:24:03