# 执行SQL脚本组件使用说明
# 组件说明
执行SQL脚本用于在转换的开始阶段或者对传入该步骤的每一行数据执行 SQL 脚本,执行一条或多条 SQL 语句。
可以执行任意 DDL/DML:create/drop/truncate/insert/update/delete/call存储过程。
有两种执行模式:整段只执行 1 次 / 上游每一行数据执行 1 次。
有两套传参体系:
- ${变量名}:全局 / 转换 / 作业变量
- ?占位符:上游数据流字段逐行传参(防 SQL 注入)
例如:delete from t where dt='${system.biz.curdate}' and id=?
# 适用场景
- 前置清理:truncate 目标表、建分区、删索引
- 复杂单条更新、批量条件修改、存储过程调用
- 按上游每条记录动态执行 SQL(逐行更新)
- 数仓初始化、后置统计 SQL 执行
# 配置项说明
| 配置名称 | 数据类型 | 是否必须 | 默认值 | 描述 |
|---|---|---|---|---|
| 节点名称 | String | 是 | - | 当前创建的节点名称,由用户自定义且不可为空。命名可包含字母、数字、下划线。 |
| 选择数据源 | String | 是 | - | 选择目标数据库连接。 |
| SQL编辑 | String | 是 | - | SQL 编辑区,多条语句用 ; 分隔。 |
| 执行每一行 | Boolean | 是 | false | - 不勾选:组件只执行 1 次 SQL,忽略上游所有数据流,适合 truncate、建表等一次性操作,在启动时就开始执行SQL,而不是等待上一个组件运行完才会执行; - 勾选:上游每一条记录,完整执行一遍 SQL,SQL 脚本会针对输入数据流中的每一行执行一次,每行数据都会替换 SQL 脚本中的相应变量。 注意:SQL 内必须使用?占位符接收上游字段参数,下方「作为参数的字段」列表必须配置字段映射。 |
| 作为单个语句执行 | Boolean | 是 | false | - 不勾选:按;拆分多条 SQL 依次执行,一条失败整体报错; - 勾选:把整个文本当作一条完整 SQL,不会按分号切割;适合存储过程、带函数体内分号的复杂脚本。 |
| 变量替换 | Boolean | 是 | false | - 不勾选:${xxx}原样传到数据库,直接语法报错; - 勾选:识别 SQL 中${变量名},自动替换 Kettle 变量(转换命名参数、作业变量、环境变量)。 注意:无论是否「执行每一行」,只要用到${}就必须勾选此项。 |
| 绑定参数 | Boolean | 是 | false | 必须勾选「执行每一行」后才能启用。 - 勾选:可以使用输入流中字段作为参数,使用 ? 作为参数标识,参数字段值需要和 ? 位置对应。 |
| 引用字符串 | Boolean | 是 | false | 必须勾选「执行每一行」,且不能和「绑定参数」同时勾选,二选一。 - 勾选:自动给字符串参数包裹数据库引号,自动转义内容里的单引号(如值O'Neil自动转成'O''Neil')。 |
| 作为参数字段 | String | 是 | - | 仅勾选「执行每一行」后生效。 勾选「绑定参数」,一键获取上一步所有输出字段,自动填充列表。 列表从上到下顺序 = SQL 中?从左到右顺序一一对应; SQL 有 3 个?,列表必须 3 个字段,少 / 多都会报错; 若同一个字段想多次使用,需上游连接「选择字段」组件复制多份同名字段。 |
| 包含插入状态字段 | String | 是 | - | insert 行数输出字段名。 |
| 包含更新状态字段 | String | 是 | - | update 行数输出字段名。 |
| 包含删除状态字段 | String | 是 | - | delete 行数输出字段名。 |
| 包含读状态字段 | String | 是 | - | select 查询行数(仅统计,不返回查询结果)。 |