使用 BAT 文件的 BIG 查询命令

kak*_*aji 3 windows cmd batch-file google-bigquery

echo Give yearmonth "yyyyMM"
setlocal enabledelayedexpansion
SET /p yearmonth= 
SET ClientName[0]=abc
SET ClientName[1]=def

SET i = 0

:myLoop
if defined ClientName[%i%] (
    call bq query --use_legacy_sql=false "CREATE EXTERNAL TABLE `test.!ClientName[%%i]!.%yearmonth%` OPTIONS (format = 'CSV',skip_leading_rows = 1 uris = ['gs://test/!ClientName[%%i]!/AWS/%yearmonth%/Metrics/data/*.csv'])"
    set /a "i+=1"
    GOTO :myLoop

)
Run Code Online (Sandbox Code Playgroud)

您好,我正在尝试创建一个批处理,以便可以一次运行多个大查询。上面我尝试编写一个批处理脚本,将命令放入循环中。

我试图通过使用yearmonth 作为用户输入来创建一个表,然后创建数组来创建一个具有不同客户端名称的表。

  1. 但我无法在我正在使用的调用查询中打印 if i =0 ClientName[i] = abc !ClientName[%%i]! 打印但它不起作用。

  2. 当我执行bat文件时,循环内的调用查询未在GCP控制台中运行。

你能帮我解决这个问题吗

Ger*_*ard 5

  1. set变量作为独立的字母字符(例如i. 原因之一就是正如您所经历的那样,您将for元变量%%iset变量混淆了%i%

  2. 您正在循环中扩展,但还没有,enabledelayedexpansion因此有两种方法,我们稍后会介绍。

  3. setting 变量前后不应有空格,=排除以下内容set /a

因此,方法 1,不带(注意如何在命令循环中delayedexpansion使用 double 变量)。%%call

@echo off
echo Give yearmonth "yyyyMM"
SET /p yearmonth= 
SET ClientName[0]=abc
SET ClientName[1]=def

SET num=0

:myLoop
if defined ClientName[%num%] (
    call bq query --use_legacy_sql=false "CREATE EXTERNAL TABLE `test.%%ClientName[%num%]%%.%yearmonth%` OPTIONS (format = 'CSV',skip_leading_rows = 1 uris = ['gs://test/%%ClientName[%num%]%%/AWS/%yearmonth%/Metrics/data/*.csv'])"
    set /a num+=1
    GOTO :myLoop

)
Run Code Online (Sandbox Code Playgroud)

方法2:(更好的方法使用delayedexpansion

@echo off
setlocal enabledelayedexpansion
echo Give yearmonth "yyyyMM"
SET /p yearmonth= 
SET ClientName[0]=abc
SET ClientName[1]=def

SET num=0

:myLoop
if defined ClientName[%num%] (
    call bq query --use_legacy_sql=false "CREATE EXTERNAL TABLE `test.!ClientName[%num%]!.%yearmonth%` OPTIONS (format = 'CSV',skip_leading_rows = 1 uris = ['gs://test/!ClientName[%num%]!/AWS/%yearmonth%/Metrics/data/*.csv'])"
    set /a num+=1
    GOTO :myLoop

)
Run Code Online (Sandbox Code Playgroud)