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

Unrecognised name error in bq command line

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

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 'call procedurename (tablename)' 它给我的错误是 'unrecognized name : tablename'。为什么会这样?

谢谢。

回答您的问题:

  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. 要将 table 名称作为参数传递,您可以尝试使用 documentation 中提到的 bq 命令行或客户端库。

例如在 bq 命令行中:

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

对评论#1 的回答:

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

例如参考这个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]))