# n8n 子工作流：Execute Sub-workflow 节点和它的触发器

> n8n 的子工作流就是一个普通的工作流，由另一个工作流用 Execute Sub-workflow 节点来调用。它以 Execute Sub-workflow Trigger 开头，由这个触发器定义输入，它的最后一个节点把结果送回调用方。子工作流的运行不计入套餐的每月执行次数，你还能在画布上把选中的节点直接转换成子工作流。

Mindket 编辑部 · 发布于 2026-11-04 · 更新于 2026-11-05 · https://mindket.com/cn/learn/n8n-advanced/n8n-sub-workflows

## 要点

- 搭一个带触发器的子工作流，并从父工作流里用已定义的输入调用它。
- 在字段、JSON 示例和接收所有数据三种输入模式里做选择。
- 把已经搭好的节点转换成子工作流，并知道转换做不到什么。
- 把繁重的任务拆成批次，让每次子运行结束后释放内存。

## 开始之前

子工作流就是一个普通工作流，只多了一个特殊的第一节点，所以前面的几课就够用了。有两处版本说明。子工作流转换功能从 n8n 1.97.0 开始提供。另外，按[发布说明](https://docs.n8n.io/changelog/release-notes)，n8n 3.0 从 2026 年 10 月 27 日起处于抢先体验阶段，它删掉了旧版节点里的两种指定子工作流的方式。两处下面都会讲到。

子工作流还不占额度。[执行页面](https://docs.n8n.io/build/understand-workflows/understand-executions)说，一个工作流用 Execute Sub-workflow 节点调用另一个工作流时，只有父工作流的那次执行计数。

**改变子工作流的几次发布**

1. **2025年6月2日** n8n 1.97.0。选中的节点可以在画布上直接转换成子工作流。
2. **2026年5月27日** n8n 2.23。1.2 版的触发器会把循环中最后一个节点每次运行的数据项都返回。
3. **2026年7月21日** n8n 2.32。转换节点时，会把挂在它们上面的 AI 子节点（比如聊天模型和记忆）一起带过去。
4. **2026年8月25日** n8n 2.37。调用方策略里的 Any workflow 被弃用，计划在 n8n 3 里移除。
5. **2026年10月27日** n8n 3.0 抢先体验。Execute Sub-workflow 节点不再有 Local File 和 URL 两种来源。

来源：[n8n Docs: Release notes 1.x](https://docs.n8n.io/changelog/release-notes-1.x) (2026-11-05 查阅)；[n8n Docs: Release notes](https://docs.n8n.io/changelog/release-notes) (2026-11-05 查阅)；[n8n Docs: v3.0 breaking changes](https://docs.n8n.io/changelog/v30-breaking-changes) (2026-11-05 查阅)

## 搭一个子工作流并调用它

下面这个示例对象是为本课写的。它放进触发器的 JSON 示例模式，用来描述父工作流必须传什么：

````json
{
  "email": "ada@example.com",
  "plan": "pro"
}
````

1. 新建一个工作流，它就是子工作流。[文档](https://docs.n8n.io/build/flow-logic/break-workflows-into-smaller-parts)还允许从父工作流里直接创建：在 Execute Sub-workflow 节点里选 **Database** 来源和 **From list**，再选 **Create a sub-workflow**。
2. 添加 **Execute Sub-workflow Trigger** 节点。在触发器分类里搜索时，它也叫 **When Executed by Another Workflow**。
3. 设置 **Input data mode**。这个示例选 **Define using JSON example**，把上面的对象粘贴进去。
4. 添加完成工作的节点，然后选择 **Save**。文档提醒，有错误的子工作流，父工作流无法触发它。
5. 打开父工作流，添加 **Execute Sub-workflow** 节点。在 **Source** 下选 **Database**，再在 **From list** 里选子工作流，或者在 **Workflow ID** 里填它的 ID。ID 就是子工作流网址里 `/workflow/` 后面的那串字符。
6. 填写 n8n 从子工作流触发器拉过来的输入项，然后运行父工作流。
7. 打开 Execute Sub-workflow 节点，选择 **View sub-execution**。子工作流自己的执行记录里，也有一个链接指回父工作流的这次运行。

## 数据怎样传入、怎样传回

数据分两步穿过。Execute Sub-workflow 节点把数据交给子工作流的触发器，子工作流的最后一个节点再把数据送回调用它的节点。调用方的 **Mode** 控制第一步：**Run once with all items** 把所有输入项放进一次执行，**Run once for each item** 则每个数据项运行一次子工作流。选项 **Wait for Sub-Workflow Completion** 决定父工作流等不等。

第二步有个版本上的坑。最后一个节点运行多次时，比如接在 Loop Over Items 之后，1.2 版的触发器会返回每一次运行的数据项，按分支拼接起来。1 和 1.1 版保持旧行为，只返回最后一次运行，另有一个 **Items to Return** 选项可以合并所有运行。[n8n 2.23 的发布说明](https://docs.n8n.io/changelog/release-notes)，日期是 2026 年 5 月 27 日，写了这个改动，而作为 LangChain 工具的调用方，始终只拿到最后一次运行的输出。

如果你在调用方里去掉了某个必填输入，子工作流收到的就是 `null`，而 **Attempt to convert types** 会尝试把数据转成子工作流要求的类型。

| 输入数据模式 | 你要定义什么 | 取舍 |
| --- | --- | --- |
| Define using fields below | 输入名称和数据类型 | 调用方把它们显示成字段，并替你填好 |
| Define using JSON example | 一个带有预期数据项和类型的示例对象 | 写起来快，示例本身也是说明 |
| Accept all data | 什么都不定义 | 没有必填输入，所以子工作流要自己处理各种异常或缺失的值 |

## 把大任务拆成批次

内存页面建议在工作流内存不足时用子工作流，做法很具体。乍一看有点反直觉，因为它至少多出两个节点。好处是子工作流只保存当前这一批的数据，这一批结束后内存就空出来了。

1. 在父工作流里放一个 **Loop Over Items** 节点，把数据项切成批次。
2. 在循环里，用 **Execute Sub-workflow** 节点调用子工作流。
3. 让子工作流处理一批数据里的繁重工作，只返回一个很小的结果，比如数量或状态，不要返回原始数据行。

## 转换已经搭好的节点

子工作流转换会把选中的节点移进一个新的子工作流，原来的位置留下一个 Execute Sub-workflow 节点。选中节点，在画布空白处右键，选择 **Convert to sub-workflow**。引用其他节点的表达式会被更新，并作为参数加到新的触发器上。

[选择规则](https://docs.n8n.io/build/flow-logic/convert-to-sub-workflows)很严格。这些节点必须是连续的一段，最多从一个节点进入、从一个节点离开，而且选中的节点里不能有触发器。Merge 节点不能当入口，If 节点不能当出口。然后再看文档列出的注意事项：

- 输入输出类型：默认都允许任何类型。要在触发器里，以及标为 Return 的 Edit Fields 节点里手动设置约束。
- 执行顺序：无论父工作流用的是哪个，新工作流都用 v1 顺序，你可以在设置里改回去。
- `first()`、`last()` 和 `all()`：n8n 可能改写它们，并在参数名后加上 `_firstItem`、`_lastItem`、`_allItems` 这样的后缀，所以每一处都要检查。
- `itemMatching`：它需要固定的下标，用表达式当下标不能转换。
- AI 节点：文档仍然要求选中智能体的所有子节点，与其他智能体共用的节点要先复制一份。从 n8n 2.32 起，转换会自动把挂着的 AI 子节点一起带过去。

## 什么时候拆、谁能调用

触发器页面给了两个拆分的理由。一个是复用：从不同来源取数据的几个工作流，可以都调用同一个生成报告的工作流。另一个是体量，上面的分批做法就是它最锋利的形式。一个很短的线性流程拆了没有好处，而且每次调用都会多出一条要打开的执行记录，调试时用的就是 **View sub-execution**。

调用还有权限这一面。在子工作流的[设置](https://docs.n8n.io/build/manage-workflows/configure-workflow-settings)里，**This workflow can be called by** 限制谁能调用它。

> **选一个窄一点的调用策略**
>
> n8n 2.37 在 2026 年 8 月 25 日发布，它弃用了这个设置里的 Any workflow 选项，计划在 n8n 3 里移除，因为它让实例里的任何项目都能调用子工作流，绕过项目权限。凡是会用到共享凭据的子工作流，就选一个更窄的策略。

## n8n 团队怎么说把工作拆成子工作流

2025 年 12 月 5 日，n8n 团队[在 X 上发了一条小技巧](https://x.com/n8n_io/status/1996965358293438760)：用子工作流让工作流的结构保持清爽，也让大数据集的内存处理更好。同一条帖子还重申了本课开头讲的额度规则：只有主工作流的运行计数。上面用 Loop Over Items 分批的做法，就是这条技巧落到实处的样子。

三个月前，2025 年 9 月 4 日，团队[在 X 上分享过这个快捷操作](https://x.com/n8n_io/status/1963603014188462414)：选中节点，右键，选 Convert X nodes to sub-workflow。帖子里的菜单名带着节点数量，文档里叫 **Convert to sub-workflow**。先拿三个相连的节点试一次，再逐个检查它改写过的表达式。

> 用子工作流让工作流的结构保持清爽，也让大数据集的内存处理更好。
>
> n8n.io, n8n 的官方账号，引文为译文, [X](https://x.com/n8n_io/status/1996965358293438760) (2026-11-05 查阅)

[![n8n.io（@n8n_io）2025 年 12 月 5 日在 X 上的帖子：小技巧，用子工作流让工作流的结构保持清爽，也让大数据集的内存处理更好。子工作流的执行不计入你的执行次数，只算主工作流。让你的工作流不重复。](https://mindket.com/blog/shots/x-n8n-io-sub-workflows-memory-tip.webp?v=9c34d4831a36)](https://x.com/n8n_io/status/1996965358293438760)

n8n.io 在 X 上，2025 年 12 月 5 日

[![n8n.io（@n8n_io）2025 年 9 月 4 日在 X 上的帖子：小技巧，几秒钟就能把工作流的一部分变成子工作流。选中节点，右键，选 Convert X nodes to sub-workflow。](https://mindket.com/blog/shots/x-n8n-io-convert-to-sub-workflow.webp?v=80b253556146)](https://x.com/n8n_io/status/1963603014188462414)

n8n.io 在 X 上，2025 年 9 月 4 日

[n8n Advanced Course (4/8) - Subworkflows](https://www.youtube.com/watch?v=xr05Ie_Hkyg)

n8n 自己的 YouTube 频道，Advanced Course 第 4 集，讲子工作流。

> X 官方嵌入卡片的截图，拍摄于 2026 年 11 月 5 日，时间为 UTC。点击截图可到 X 上打开原帖。

## 常见错误

- 调用一个有错误的子工作流。文档说父工作流无法触发它，所以要先修好并保存子工作流。
- 习惯性地选 Accept all data。这样子工作流不定义任何必填输入，调用方也不显示输入字段，所有检查都落在你自己身上。
- 关掉 Wait for Sub-Workflow Completion，却又搭了需要结果的后续步骤。关掉之后，父工作流不等待就往下走。
- 继续用 Local File 或 URL 来源。[n8n 3.0](https://docs.n8n.io/changelog/v30-breaking-changes) 把这两种来源从 Execute Sub-workflow 节点里删掉了，仍在用的节点会失败。请导入子工作流并用 Database 来源，或者用 Define Below 粘贴它的 JSON（节点 1.1 及更早版本里叫 Parameter）。
- 以为循环里的最后一个节点每次运行都会通过旧版触发器返回。旧版本只返回最后一次运行，除非设置了 Items to Return。
- 转换一个有两个入口，或者里面带触发器的选区。转换需要一个入口节点、一个出口节点，而且没有触发器。

## 自己试一试

- 搭好示例的这一对工作流，然后在父工作流的节点里去掉一个输入，看子工作流收到什么。文档说，那一项收到的是 null。
- 在你自己的某个工作流里选中三个相连的节点，把它们转换掉，再检查每个用到 `first()`、`last()` 或 `all()` 的表达式。
- 把调用方从 Run once with all items 改成 Run once for each item，比较这次运行产生了多少次子执行。
- 把子工作流的调用方设置改成比 Any workflow 更窄的选项，看看父工作流有什么反应。

## 接下来学什么

[第 3 课](https://mindket.com/cn/learn/n8n-advanced/n8n-code-node)深入单个节点：Code 节点，处理内置节点覆盖不到的转换。子工作流也是 AI 智能体用到你自己逻辑的方式。[AI 智能体那一课](https://mindket.com/cn/learn/n8n/n8n-ai-agent)提到的 Call n8n Workflow Tool 节点，调用的就是一个以 Execute Sub-workflow Trigger 开头的工作流。另外，[Mindket 的 n8n 工作流](https://mindket.com/cn/automations/n8n)能看到现成的工作流是怎样拆分任务的。

## 自测一下

1. 子工作流必须以哪个节点开头？

   A. Manual Trigger
   B. Webhook
   C. Execute Sub-workflow Trigger
   D. Error Trigger

   答案：C。 子工作流以 Execute Sub-workflow Trigger 开头，调用它的节点把数据交给这个触发器。

2. 哪种输入数据模式会让子工作流自己处理缺失或异常的值？

   A. Accept all data
   B. Define using fields below
   C. Define using JSON example

   答案：A。 Accept all data 不定义任何必填输入，所以子工作流要能应付任何输入。

3. 父工作流循环处理几千行数据，内存不够用了。本课建议怎么做？

   A. 让子工作流返回每一行
   B. 把繁重的工作留在父工作流里
   C. 关掉 Wait for Sub-Workflow Completion
   D. 在子工作流里按批次做繁重的工作，只返回一个很小的结果

   答案：D。 子工作流只保存当前这一批的数据，这一批结束后内存就空出来了。

4. Execute Sub-workflow 节点仍在用 Local File 来源，在 n8n 3.0 上会怎样？

   A. 照常工作
   B. 报错失败
   C. n8n 自动把它转成 Database

   答案：B。 n8n 3.0 删除了 Local File 和 URL 来源，仍在用的节点会失败。

## 常见问题

### 在 n8n 里怎样从一个工作流调用另一个工作流？

在父工作流里添加 Execute Sub-workflow 节点，选 Database 来源，再从列表里选子工作流，或者填它的 ID。子工作流必须以 Execute Sub-workflow Trigger 开头。

### 子工作流的执行会计入我的 n8n 套餐吗？

不会。文档说，子工作流的执行不计入套餐的每月执行次数和活跃工作流数量，而且只有父工作流这次顶层执行才计入额度。

### 怎样从父工作流找到子工作流的执行记录？

每次调用都会留下自己的执行记录，两个方向都有链接。在父工作流里，Execute Sub-workflow 节点上有 View sub-execution 链接，子工作流的那次运行也会链接回父工作流。

### 已经搭好的节点能转成子工作流吗？

能，从 n8n 1.97.0 开始。选中一段连续的节点，要求有一个入口、一个出口、没有触发器，在画布空白处右键，选择 Convert to sub-workflow。

### AI 智能体能调用子工作流吗？

能，工具节点可以调用它，智能体就能复用你已经搭好的逻辑。Call n8n Workflow Tool 节点指向一个以 Execute Sub-workflow Trigger 开头的工作流，并像 Execute Sub-workflow 节点那样，拉取触发器定义的输入字段。

### n8n 3.0 里子工作流有什么变化？

Local File 和 URL 来源没有了，调用方策略里的 Any workflow 也即将移除。升级之前，n8n 的[发布公告](https://blog.n8n.io/introducing-n8n-v3/)要求在 2.39 或更高版本上打开 Settings 里的 Migration Report 看一遍。

## 资料来源

- [n8n Docs: Break workflows into smaller parts](https://docs.n8n.io/build/flow-logic/break-workflows-into-smaller-parts) (2026-11-04 查阅)
- [n8n Docs: Convert to sub-workflows](https://docs.n8n.io/build/flow-logic/convert-to-sub-workflows) (2026-11-04 查阅)
- [n8n Docs: Execute Sub-workflow node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflow) (2026-11-04 查阅)
- [n8n Docs: Execute Sub-workflow Trigger node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflowtrigger) (2026-11-04 查阅)
- [n8n Docs: Understand executions](https://docs.n8n.io/build/understand-workflows/understand-executions) (2026-11-04 查阅)
- [n8n Docs: Configure workflow settings](https://docs.n8n.io/build/manage-workflows/configure-workflow-settings) (2026-11-04 查阅)
- [n8n Docs: Fix memory issues](https://docs.n8n.io/deploy/host-n8n/configure-n8n/scaling/fix-memory-issues) (2026-11-04 查阅)
- [n8n Docs: Release notes](https://docs.n8n.io/changelog/release-notes) (2026-11-05 查阅)
- [n8n Docs: v3.0 breaking changes](https://docs.n8n.io/changelog/v30-breaking-changes) (2026-11-05 查阅)
- [n8n Docs: Release notes 1.x](https://docs.n8n.io/changelog/release-notes-1.x) (2026-11-05 查阅)
- [n8n Blog: Introducing n8n 3.0](https://blog.n8n.io/introducing-n8n-v3/) (2026-11-05 查阅)
- [n8n.io on X: use sub-workflows to improve memory handling, 5 December 2025](https://x.com/n8n_io/status/1996965358293438760) (2026-11-05 查阅)
- [n8n.io on X: convert nodes to a sub-workflow, 4 September 2025](https://x.com/n8n_io/status/1963603014188462414) (2026-11-05 查阅)
- [n8n on YouTube: n8n Advanced Course (4/8) - Subworkflows](https://www.youtube.com/watch?v=xr05Ie_Hkyg) (2026-11-05 查阅)

[浏览 n8n 工作流](https://mindket.com/cn/automations/n8n)
