2017-12-27 15 views
1

BQ 테이블 대상에 대해 Linux 명령 줄에서 SQL을 실행하려고합니다. 이 SQL 스크립트는 여러 날짜, 클라이언트 및 BQ 테이블 대상에 사용되므로 내 BQ API 명령 줄 호출 (플래그 - 매개 변수)에서 매개 변수를 사용해야합니다. 이제이 링크를 따라 매개 변수가있는 쿼리에 대해 알아 보았습니다 : https://cloud.google.com/bigquery/docs/parameterized-queries,하지만 테이블 이름을 선언하는 데 도움이됩니다.Google BQ : 매개 변수 변수가 BQ 테이블 대상 인 매개 변수가있는 쿼리 실행

매개 변수의 변수는 다음과 같은 표현
#standardSQL 
SELECT * 
FROM (SELECT * 
     FROM @variable_table 
     WHERE CAST(_PARTITIONTIME AS DATE) = @variable_date) as final 
WHERE final.Advertiser IN UNNEST(@variable_clients) 

:

  • variable_table : 내가 원하는 BQ 테이블 대상
  • 전화를

    는 Advertiser_Date_Check.sql라는 내 SQL 스크립트, 다음과 같은 것이있다
  • variable_date : BQ 테이블에서 가져 오려는 날짜
  • variable_clients : 내가 속한 특정 클라이언트의 배열 목록 NT 지금

(I가 참조 된 날로부터 인) 데이터에서 끌어의 BQ 데이터에 대한 내 명령 줄 (LINUX)는 @variable_date 및 @variable_clients의 다음

TABLE_NAME=table_name_example 
BQ_TABLE=$(echo '`project_id.dataset_id.'$TABLE_NAME'`') 
TODAY=$(date +%F) 

/bin/bq query --use_legacy_sql=false \ 
     --parameter='variable_table::'$BQ_TABLE'' \ 
     --parameter=variable_date::"$TODAY" \ 
     --parameter='variable_clients:ARRAY<STRING>:["Client_1","Client_2","Client_3"]' \ 
     "`cat /path/to/script/Advertiser_Date_Check.sql`" 

매개 변수입니다 그것이 단지 그들이었을 때 과거에는 잘 돌아갔다. 그러나 루프의 여러 테이블에서이 정확한 SQL 명령을 실행하고자하므로 variable_table이라는 매개 변수를 만들었습니다.

Error in query string: Error processing job ... : Syntax error: Unexpected "@" at [4:12] 
: 나는 명령 줄에서이 작업을 실행하려고 할 때마다

`project_id.dataset_id.table_name` 

, 나는 일반적으로 다음과 같은 오류가 발생합니다 : 테이블 이름 규칙은 형식으로 할 필요가 있도록 매개 변수화 된 쿼리, 표준 SQL 형식으로해야

매개 변수 @variable_table을 참조하고 있으므로 테이블 이름을 참조하는 것이 힘들다. 과거 시도에서, 심지어 오류가 있음 :

project_id.dataset_id.table_name: command not found 

하지만이 때문에 테이블 대상 이름의 가난한 참고로 대부분이었다. 첫 번째 오류가 가장 흔한 오류입니다.

전반적으로,이 문제에 대한 내 질문은 : 나는에서 매개 변수가있는 쿼리에 대한 명령 줄에서 매개 변수로 BQ 표를 참조하려면 어떻게

  1. FROM 절 (예 : 내가 @variable_table으로 수행하려고 할 것과)? 심지어 가능할까요?
  2. 내가 현재하고있는 방법 외에 명령 줄에서 여러 BQ 테이블에 대한 쿼리를 실행하는 다른 방법을 알고 있습니까?

희망이 모든 것이 의미가 있으며 도움을 주셔서 감사합니다.

나는이 경우에 당신을 위해 작동 할 수 있습니다 어떻게 생각

Parameters cannot be used as substitutes for identifiers, column names, table names, or other parts of the query.

는하지만, 대신 쿼리 매개 변수의 (일반 쉘 변수로 테이블 이름의 주입을 수행 할 수 있습니다 : 당신이 링크 된 문서에서

+0

연결된 설명서에서 "매개 변수는 식별자, 열 이름, 테이블 이름 또는 쿼리의 다른 부분을 대신 사용할 수 없습니다." –

+0

오 ~ 이런. 나는 그 부분을 놓친 것 같습니다. 꽤 긴 하루였습니다. 답장을 보내 주셔서 감사합니다. –

+2

나는 당신을 위해 무엇이 효과가 있을지 생각하지만, 쿼리 매개 변수 대신에 정규 쉘 변수로 테이블 이름을 주입하는 것으로 생각한다. 당신은 SQL 인젝션을 피하기 위해 당신이 그 내용을 신뢰하는지, 아니면 당신이 문자열을 스스로 만들고 있는지 확인하고 싶을 것이다. –

답변

2

). 당신은 SQL 삽입을 피하기 위해 당신이 그 내용을 신뢰하는지, 또는 문자열을 스스로 만들고 있는지 확인하고자 할 것입니다. 한 가지 방법은 테이블 이름에 하드 코딩 된 상수를 입력 한 다음 사용자 입력을 기반으로 쿼리 텍스트에 삽입 할 상수를 선택하는 것입니다.

관련 문제