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( """ \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
相关产品推荐
相关产品推荐

