bq命令行调用存储过程提示Unrecognised name error问题咨询
错误成因
- 核心原因是你在bq命令行执行的调用语句中,
tablename没有作为字符串参数传入,被BigQuery SQL解析器识别为了当前上下文未定义的变量/标识符,因此抛出未识别名称的错误。 - 你在BQ控制台调用时应该是直接传入了包裹单引号的表名字符串值(例如
call procedurename('项目名.数据集名.表名')),参数格式合法所以可以正常执行。
修复方案
你可以选择以下任意一种方式修复调用命令:
- 直接传入带引号的表名常量,注意shell中单引号嵌套需要转义,或者外层用双引号包裹SQL语句:
# 外层用双引号包裹SQL,内层表名用单引号 bq query --use_legacy_sql=false "call procedurename('your_project.your_dataset.your_table')" # 或者转义内层单引号 bq query --use_legacy_sql=false 'call procedurename(\'your_project.your_dataset.your_table\')'
- 若需要动态传参,建议使用bq命令行的参数绑定功能,同时避免SQL注入风险:
bq query --use_legacy_sql=false \ --parameter=tablename:STRING:your_project.your_dataset.your_table \ 'call procedurename(@tablename)'
额外优化建议:你当前编写的存储过程直接拼接表名到动态SQL中,存在SQL注入风险,建议使用BigQuery内置的
BQ.STRING()函数对表名参数做转义处理,修改后的赋值语句为:Set sql1= 'select count(*) from ' || BQ.STRING(tablename);。
内容的提问来源于stack exchange,提问作者Kavya14
相关产品推荐
相关产品推荐

