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

如何在dbt的Ephemeral Model(临时模型)中动态传递变量?

在dbt中向临时模型动态传递变量的解决方案

可以向临时模型动态传递变量,但你当前使用模型config中vars的方式无法生效——模型级的vars仅作用于当前模型本身,不会自动传递给它引用的依赖模型(包括临时模型)。下面提供两种可行的实现方式:

方式一:通过带参数的ref传递变量

这种方法基于dbt的ref函数支持传递参数的特性,将变量直接注入到临时模型的上下文:

  1. 保持临时模型(比如命名为ephemeral_table1_cte)的代码不变:
WITH table1_cte AS (
      SELECT col1, col2, col3 FROM table1
      WHERE
          filter_condition1
          AND filter_condition2
          AND filter_condition3
          AND form_id = {{ var('form_id') }}
      QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col4) = 1
)
SELECT * FROM table1_cte
  1. 在rs_model1中引用临时模型时,通过ref的第二个参数传递变量:
WITH table1_cte AS (
    SELECT * FROM {{ ref('ephemeral_table1_cte', {'form_id': 123}) }}
)
-- 这里编写rs_model1的后续业务逻辑
  1. 在rs_model2中同理传递对应的值:
WITH table1_cte AS (
    SELECT * FROM {{ ref('ephemeral_table1_cte', {'form_id': 111}) }}
)
-- 这里编写rs_model2的后续业务逻辑

方式二:用宏封装可复用的CTE逻辑

如果不需要依赖临时模型,使用宏封装参数化的CTE代码会更直观灵活,也能彻底避免变量传递的上下文问题:

  1. 在dbt项目的macros/目录下创建宏文件(比如macros/get_table1_cte.sql):
{% macro get_table1_cte(form_id) %}
    SELECT col1, col2, col3 FROM table1
    WHERE
        filter_condition1
        AND filter_condition2
        AND filter_condition3
        AND form_id = {{ form_id }}
    QUALIFY ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col4) = 1
{% endmacro %}
  1. 在rs_model1中直接调用宏并传入参数:
WITH table1_cte AS (
    {{ get_table1_cte(123) }}
)
-- rs_model1的后续业务逻辑
  1. 在rs_model2中调用宏传入对应值:
WITH table1_cte AS (
    {{ get_table1_cte(111) }}
)
-- rs_model2的后续业务逻辑

内容的提问来源于stack exchange,提问作者user375647

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:00:14