Snowflake SQL UDF报错:dbt宏调用时出现意外'create'语法错误
问题原因及解决方法
核心问题
你把函数创建宏和函数调用的逻辑混在了一起。当你直接在SELECT语句里写{{ target.schema }}.multiply1(5,2)时,既没有先执行宏来创建函数,还可能错误地让宏的CREATE FUNCTION语句被渲染到了SELECT的上下文里,这直接导致了语法错误。
分步解决
1. 先执行宏创建数据库函数
dbt里这类DDL(数据定义语言)宏需要单独执行,不能嵌入到SELECT查询中。在终端运行以下命令:
dbt run-operation product_nums
这条命令会触发dbt执行你定义的product_nums宏,在target.schema指定的数据库schema中创建multiply1函数。
2. 修正函数语法(适配Snowflake)
如果执行宏时仍报错,检查Snowflake的函数创建语法:Snowflake推荐用$$作为字符串分隔符(避免单引号转义问题),同时添加or replace可以覆盖已存在的函数,避免重复创建报错。修改后的宏如下:
{% macro product_nums() %} create or replace function {{ target.schema }}.multiply1 (a number, b number) returns number language sql as $$a * b$$; {% endmacro %}
3. 正常调用函数
函数创建完成后,直接在SELECT查询中引用即可,不需要再关联宏:
SELECT {{ target.schema }}.multiply1(5,2)
关键注意点
- DDL类宏(创建函数、表、视图等)要么通过
dbt run-operation单独执行,要么放到on-run-start/on-run-end钩子中自动执行。 - 函数是数据库中的持久化对象,创建完成后,后续查询直接引用即可,无需再依赖宏。
内容的提问来源于stack exchange,提问作者skyzine
相关产品推荐
相关产品推荐

