在复制到命令时使用 perl dbi 出现语法错误
syntax error using perl dbi on copy into command
我有一个复制到 table 命令,在 sql 中包含多个美元符号,所有这些都被转义了。如果我从脚本中打印出实际命令并手动执行它,它就可以完美运行。但是当 perl 脚本执行它时,我得到一个语法错误。这就是我要执行的,命令的打印输出,然后是 sql 错误,(我在脚本中分配了一个 $file 来插入数据,这样美元符号就不会在下面逃脱)
my $sql = "COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
$1:auction_id_64 as AUCTION_ID_64,
DATEADD(S,$1:date_time,'1970-01-01') as DATE_TIME,
$1:user_tz_offset as USER_TZ_OFFSET,
$1:creative_width as CREATIVE_WIDTH,
$1:creative_height as CREATIVE_HEIGHT
FROM \@DBNAME.lnd.S3_PROD_ADIP/$file)
pattern = '\.*\.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';";
my $sth = $dbh->prepare($sql);
$sth->execute;
COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
:auction_id_64 as AUCTION_ID_64,
DATEADD(S,:date_time,'1970-01-01') as DATE_TIME,
:user_tz_offset as USER_TZ_OFFSET,
:creative_width as CREATIVE_WIDTH,
:creative_height as CREATIVE_HEIGHT
FROM @DBNAME.lnd.S3_PROD_ADIP/pr/appnexus/data_dt=20220217/19/STANDARD_20220218012146.gz.parquet)
pattern = '.*.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';
SQL 编译错误:位置 4 处的语法错误行 3 意外“?”。位置 13 处的语法错误行 4 意外“?”。位置 13 处的语法错误第 4 行意外“?”。
COPY INTO DWH_AIR.LND_APN.LND_STANDARD_IMP_EVENT FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
? as AUCTION_ID_64,
DATEADD(S,?,'1970-01-01') as DATE_TIME,
? as USER_TZ_OFFSET,
? as CREATIVE_WIDTH,
? as CREATIVE_HEIGHT
第3行第4位是第3行'$1'后的问号。我不明白,为什么要删除字符串的“:auction_id_64”部分?
它似乎将 : 解释为绑定变量值,而不是变体中的值。您是否尝试过使用括号表示法?
https://docs.snowflake.com/en/user-guide/querying-semistructured.html#bracket-notation
我相信它看起来像
COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
['auction_id_64'] as AUCTION_ID_64,
DATEADD(S,['date_time'],'1970-01-01') as DATE_TIME,
['user_tz_offset'] as USER_TZ_OFFSET,
['creative_width'] as CREATIVE_WIDTH,
['creative_height'] as CREATIVE_HEIGHT
FROM @DBNAME.lnd.S3_PROD_ADIP/pr/appnexus/data_dt=20220217/19/STANDARD_20220218012146.gz.parquet)
pattern = '.*.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';
我不确定这是否有效,但如果无效,我将删除答案。
我有一个复制到 table 命令,在 sql 中包含多个美元符号,所有这些都被转义了。如果我从脚本中打印出实际命令并手动执行它,它就可以完美运行。但是当 perl 脚本执行它时,我得到一个语法错误。这就是我要执行的,命令的打印输出,然后是 sql 错误,(我在脚本中分配了一个 $file 来插入数据,这样美元符号就不会在下面逃脱)
my $sql = "COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
$1:auction_id_64 as AUCTION_ID_64,
DATEADD(S,$1:date_time,'1970-01-01') as DATE_TIME,
$1:user_tz_offset as USER_TZ_OFFSET,
$1:creative_width as CREATIVE_WIDTH,
$1:creative_height as CREATIVE_HEIGHT
FROM \@DBNAME.lnd.S3_PROD_ADIP/$file)
pattern = '\.*\.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';";
my $sth = $dbh->prepare($sql);
$sth->execute;
COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
:auction_id_64 as AUCTION_ID_64,
DATEADD(S,:date_time,'1970-01-01') as DATE_TIME,
:user_tz_offset as USER_TZ_OFFSET,
:creative_width as CREATIVE_WIDTH,
:creative_height as CREATIVE_HEIGHT
FROM @DBNAME.lnd.S3_PROD_ADIP/pr/appnexus/data_dt=20220217/19/STANDARD_20220218012146.gz.parquet)
pattern = '.*.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';
SQL 编译错误:位置 4 处的语法错误行 3 意外“?”。位置 13 处的语法错误行 4 意外“?”。位置 13 处的语法错误第 4 行意外“?”。
COPY INTO DWH_AIR.LND_APN.LND_STANDARD_IMP_EVENT FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
? as AUCTION_ID_64,
DATEADD(S,?,'1970-01-01') as DATE_TIME,
? as USER_TZ_OFFSET,
? as CREATIVE_WIDTH,
? as CREATIVE_HEIGHT
第3行第4位是第3行'$1'后的问号。我不明白,为什么要删除字符串的“:auction_id_64”部分?
它似乎将 : 解释为绑定变量值,而不是变体中的值。您是否尝试过使用括号表示法?
https://docs.snowflake.com/en/user-guide/querying-semistructured.html#bracket-notation
我相信它看起来像
COPY INTO metaproc.control_table FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
['auction_id_64'] as AUCTION_ID_64,
DATEADD(S,['date_time'],'1970-01-01') as DATE_TIME,
['user_tz_offset'] as USER_TZ_OFFSET,
['creative_width'] as CREATIVE_WIDTH,
['creative_height'] as CREATIVE_HEIGHT
FROM @DBNAME.lnd.S3_PROD_ADIP/pr/appnexus/data_dt=20220217/19/STANDARD_20220218012146.gz.parquet)
pattern = '.*.parquet' file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';
我不确定这是否有效,但如果无效,我将删除答案。