navicat自动化脚本不支持动态参数传递,所有变量如%date%、{datetime}等仅限导出文件名中使用,sql语句中需依赖数据库原生函数(如curdate())实现动态值计算。
navicat 自动化脚本里不能传递动态参数——它压根不支持运行时变量注入,所谓“全局变量”或“系统环境变量”在批处理作业、计划任务、sql 文件执行上下文中全部不可用。
Navicat 批处理作业里为什么读不到 $PATH 或 %DATE%
Navicat 的批处理作业和计划任务是独立进程调度器驱动的,不继承 shell 或 Windows 命令行环境变量。你写 SELECT * FROM logs WHERE dt = '%DATE%',Navicat 不会替换,而是原样发给数据库,报错或查空。
- 所有 SQL 内容在提交前就完成解析,不走预处理器(比如没有类似 MySQL 的
SET @var := ...跨步生效机制) -
{datetime}占位符只在导出文件名中有效,且仅限两种格式:{datetime}和{datetime:yyyyMMddHHmmss},不能用于 SQL 语句体 - Windows 系统变量如
%USERNAME%、%COMPUTERNAME%在 .sql 文件里直接写,Navicat 会当普通字符串传给数据库,不会展开
想让 SQL 脚本用上当前日期,只能靠数据库原生函数
真正能用的动态值,必须由数据库自己计算。比如你要按天分区同步数据,就得把逻辑写进 SQL,而不是依赖外部传参。
- MySQL:用
CURDATE()、DATE_SUB(CURDATE(), INTERVAL 1 DAY) - PostgreSQL:用
CURRENT_DATE、CURRENT_DATE - INTERVAL '1 day' - SQL Server:用
GETDATE()、DATEADD(day, -1, GETDATE()) - 别写
WHERE dt = '{datetime:yyyymmdd}'—— 这种写法在 SQL 里完全无效,只会字面匹配字符串
如果真需要外部参数驱动,必须绕开 Navicat 内置调度
Navicat 不是脚本引擎,它是 GUI 封装工具。要实现参数化,得把它降级为“执行终端”,把控制权交给外部。
- 用 PowerShell 或 Python 生成带参数的 .sql 文件,再调用
navicat.exe /batchjob "job_name"触发 - 在脚本里拼好完整 SQL,例如
"SELECT * FROM t WHERE dt = '$(Get-Date -Format 'yyyy-MM-dd')'",写入临时文件,再让 Navicat 执行该文件 - 避免用 Navicat 直接跑含变量的查询;改用命令行工具(如
mysql -e或psql -c)配合 shell 变量,更可控 - 注意:Navicat 的
run_job()函数第二个参数是超时秒数,不是参数列表,也不能传值进去
最常被忽略的一点:很多人以为在「计划任务」里填了「参数」字段就能传参,其实那个字段只是日志备注,Navicat 根本不解析也不传递——它只负责触发,不负责组装。











