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

SQLFluff检测BigQuery动态SQL时EXECUTE IMMEDIATE解析失败求助

问题描述

我使用SQLFluff 0.13.2版本检查BigQuery SQL代码格式,配置如下:

sqlfluff = "^0.13.2"
[tool.sqlfluff]
sql_file_exts = [".sql"]
[tool.sqlfluff.core]
dialect = "bigquery"
rules = "L001,L002,L003,L004,L005,L006,L008,L009,L010,L012,L013,L015,L016,L018,L019,L020,L022,L023,L024,L025,L035,L036,L037,L038,L039,L040,L041,L045,L046,L048,L049,L050,L051,L052,L053,L061,L063"

我的SQL代码使用了BigQuery的EXECUTE IMMEDIATE动态SQL语法:

DECLARE
  c_c string;
DECLARE
  ps ARRAY<string>;
DECLARE
  p_cc string;
DECLARE
  d_cc string;
CREATE TABLE IF NOT EXISTS
  `dataset.table` ( A STRING,
    B STRING,
    C STRING,
    D STRING,
    F STRING,
    E STRING,
    G STRING,
    H STRING,
    E STRING,
    J timestamp,
    K INT64 ) PARTITION BY
  RANGE_BUCKET(K, GENERATE_ARRAY(0,100,1));
SET
  c_c="code1";
SET
  ps = ["project-code1",
  "project-code2",
  "project-code3",
  "project-code4",
  "project-code5",
  "project-code6"];
SET
  p_cc = (
  WITH
    ps_cte AS (
    SELECT
      *
    FROM
      UNNEST(ps) ps
    WHERE
      ps LIKE CONCAT('%-', c_c))
  SELECT
    ps
  FROM
    ps_cte);
SET
  d_cc = CONCAT(p_cc,".sales_",c_c,".");
EXECUTE IMMEDIATE
  FORMAT( """ 
  CREATE OR REPLACE TEMP TABLE temp_table AS
SELECT
    cols
FROM
     `%ssat_table` sc
 """,d_cc)

执行poetry run sqlfluff lint query.sql命令时,出现解析错误:

L:  47 | P:   1 |  PRS | Line 47, Position 1: Found unparsable section: 'EXECUTE
                   | IMMEDIATE\n FORMAT( &quot;&quot;&quot; \n CREAT...'
原因分析

SQLFluff 0.13.2版本的BigQuery方言解析器对EXECUTE IMMEDIATE结合FORMAT函数+多行三重引号的语法支持存在缺陷,无法正确解析这种复杂的动态SQL结构,导致抛出解析错误(PRS错误)。

解决办法

1. 升级SQLFluff版本

后续版本(如0.14.0及以上)的SQLFluff对BigQuery动态SQL的解析能力有明显改进,能够正确识别EXECUTE IMMEDIATE语法。通过以下命令升级依赖:

poetry add sqlfluff@^0.14.0

建议升级到最新稳定版,获得更好的兼容性和功能支持。

2. 临时跳过解析检查

如果暂时无法升级版本,可以在无法解析的代码段前添加SQLFluff的忽略注释,让lint工具跳过该部分的解析检查:

-- sqlfluff: noqa: PRS
EXECUTE IMMEDIATE
  FORMAT( """ 
  CREATE OR REPLACE TEMP TABLE temp_table AS
SELECT
    cols
FROM
     `%ssat_table` sc
 """,d_cc)

注释中的PRS指定跳过解析类错误,这样就能避免该报错影响整体lint结果。

3. 调整SQL代码格式

尝试简化动态SQL的写法,比如将多行三重引号字符串改为单行,或者调整格式让旧版本解析器更容易识别:

EXECUTE IMMEDIATE FORMAT(
  'CREATE OR REPLACE TEMP TABLE temp_table AS SELECT cols FROM `%ssat_table` sc',
  d_cc
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:50:45