Trino SQL Server Connector调用system.execute存储过程报错求助
DBT + Trino SQL Server Connector 更新分区存储过程调用问题解决
问题场景
通过DBT结合Trino的SQL Server Connector,尝试执行语句更新全局分区,具体需求是调用存储过程执行ALTER PARTITION SCHEME PS_FunctionName NEXT USED [PRIMARY],但遇到三类错误:
- 模型中用WITH子句嵌套CALL:
Mismatched input CALL. Expecting: '<query>' - Starburst直接执行CALL:
mismatched input "execute". Expecting '<identifer>' - 改用DBT call block:仍触发相同的execute匹配错误
错误根源
- WITH子句限制:WITH要求后续必须是查询语句,CALL属于执行类语句,无法嵌套,这是第一个错误的直接原因。
- 存储过程调用语法错误:Trino的SQL Server Connector不支持
system.execute这种写法,混淆了Trino内部存储过程和SQL Server原生存储过程的调用方式,Starburst解析时会把system.execute当作Trino内部标识符,找不到匹配项,导致报错。
解决步骤
1. 修正跨连接器存储过程调用语法
SQL Server中执行动态DDL需用sp_executesql系统存储过程,Trino中调用SQL Server端的存储过程必须指定对应的catalog和schema,正确语句如下:
CALL your_sqlserver_catalog.dbo.sp_executesql('ALTER PARTITION SCHEME PS_FunctionName NEXT USED [PRIMARY]')
把your_sqlserver_catalog替换为你配置的SQL Server连接器对应的catalog名称。
2. 在DBT中正确执行无返回语句
DBT模型默认期望返回结果集,CALL语句无返回,需用run_query()宏或自定义操作执行:
方案一:自定义DBT操作(推荐独立执行场景)
创建macro文件(如macros/update_partition_scheme.sql):
{% macro update_partition_scheme() %} {% set sql %} CALL your_sqlserver_catalog.dbo.sp_executesql('ALTER PARTITION SCHEME PS_FunctionName NEXT USED [PRIMARY]') {% endset %} {% do run_query(sql) %} {% endmacro %}
命令行执行:
dbt run-operation update_partition_scheme
方案二:模型内结合查询执行(适用于后续要加时间戳查询的场景)
直接在模型中先执行分区更新,再写查询逻辑:
{{ config(materialized='table') }} -- 执行分区更新 {% set update_sql %} CALL your_sqlserver_catalog.dbo.sp_executesql('ALTER PARTITION SCHEME PS_FunctionName NEXT USED [PRIMARY]') {% endset %} {% do run_query(update_sql) %} -- 后续的时间戳查询示例 SELECT * FROM your_target_table WHERE created_at >= CURRENT_TIMESTAMP - INTERVAL '7 days'
3. 先在Starburst验证语法
先在Starburst控制台执行修正后的CALL语句,确认能成功执行再移植到DBT,避免后续排查麻烦。
内容的提问来源于stack exchange,提问作者Kate Ottenwess
相关产品推荐
相关产品推荐

