dbt宏参数未编译求助:调用宏时参数丢失
问题原因
你调用宏时直接传入InicioPrev这类裸列名,dbt会将其视为Jinja变量而非列名。由于未定义对应变量,编译时该变量会被替换为空值,最终出现try_cast( as timestamp)的结果。
解决方案
有两种常用修正方式:
方式1:传递字符串参数并适配标识符
修改宏的写法,让它能将字符串参数转为数据库识别的列标识符:
{% macro convert_to_timestamp(column_name) %} try_cast({{ adapter.quote(column_name) }} as timestamp) {% endmacro %}
调用宏时,把列名用引号包裹作为字符串传入:
select SMP, {{ convert_to_timestamp('InicioPrev') }} as InicioPrev, {{ convert_to_timestamp('FimPrevisao') }} as FimPrevisao from {{ ref('src_smp_programado') }}
adapter.quote()会根据你使用的数据库(如Snowflake、BigQuery等)自动添加正确的引号,确保列名被正确识别。
方式2:直接传递列标识符(简化写法)
如果不想修改宏,也可以在调用时用括号包裹列名,让dbt将其视为字符串字面量而非变量:
select SMP, {{ convert_to_timestamp(('InicioPrev')) }} as InicioPrev, {{ convert_to_timestamp(('FimPrevisao')) }} as FimPrevisao from {{ ref('src_smp_programado') }}
宏里的{{ column_name }}会直接输出传入的列名,无需额外适配。
内容的提问来源于stack exchange,提问作者Maurício Schwartsman
相关产品推荐
相关产品推荐

