bq 命令行中出现无法识别的名称错误

Unrecognised name error in bq command line

提问人:Kavya14 提问时间:11/22/2021 最后编辑:Kavya14 更新时间:11/24/2021 访问量:838

问:

我想获取表的记录计数。我写了以下程序。

Create or replace procedure 
procedurename(In tablename string)
Begin
Declare sql1 string
Set sql1= 'select count(*) from ' ||tablename;
Execute immediate sql1;
End;

问题:

  1. 当我使用 invoke sp 在 bq 控制台中执行它时,它给了我计数。 但是当我在 bq 命令行中执行它时,使用 bq 查询 --use_legacy_sql=false '调用过程名称 (tablename)' 它给了我错误“无法识别的名称:tablename”。为什么会这样?

谢谢。

sql 存储过程 google-bigquery 参数传递

评论

0赞 Kavya14 12/1/2021
@SakshiGatyan当然。完成:)

答:

2赞 Sakshi Gatyan 11/23/2021 #1

回答您的问题:

  1. 您收到错误,因为您的查询未定义。Unrecognized name:'tablename'tablename

尝试使用以下命令执行存储过程

bq query \
--use_legacy_sql=false \
‘DECLARE tablename STRING DEFAULT NULL;
set tablename="your-table-name";
CALL `projectid.datasetid.procedurename`(tablename);’
    
  1. 要将 tablename 作为参数传递,您可以尝试使用本文档中提到的 bq 命令行或客户端库。

例如,在 bq 命令行中:

    bq query \
    --use_legacy_sql=false \
    --parameter=tablename:string:your-table-name \
    'DECLARE tablename STRING ;
    CALL `projectid.datasetid.procedurename`(@tablename);'

对评论#1的回答:

  • 使用 bq 命令行无法在运行时传递用户输入,但可以改用客户端库在运行时传递表名。

例如,请参阅以下 python 脚本:

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client(project="project_id")

mytable1=raw_input("Enter your table: ")

query = """
   DECLARE tablename STRING ;
   CALL `project_id.dataset.procFedurename`(@tablename);

"""
job_config = bigquery.QueryJobConfig(
   query_parameters=[
       bigquery.ScalarQueryParameter("tablename", "STRING", mytable1),
      
   ]
)

job = client.query(query, job_config=job_config)  # Make an API request.

for row in job.result():
   print("No of records:{}".format(row[0]))

评论

0赞 Kavya14 11/23/2021
谢谢。您能否告诉我是否有一种方法可以使用此 SP 打印语句,它会在运行时要求我键入表的名称,并在给出名称后给我结果?
0赞 Kavya14 11/23/2021
嗨,我在 bq 命令行中尝试了上述命令,但我仍然收到“无法识别的名称”错误。
0赞 Sakshi Gatyan 11/23/2021
嗨,@Kavya14,我已经编辑了评论#1的答案。
0赞 Sakshi Gatyan 11/23/2021
我能够使用上述命令成功获得结果。输出。请检查您是否正确使用该命令。如果问题仍然存在,请与命令一起共享您的完整错误。