简体   繁体   English

复制到命令时使用 perl dbi 出现语法错误

[英]syntax error using perl dbi on copy into command

I have a copy into table command that includes multiple dollar signs in the sql, all of which are escaped.我有一个复制到表命令,其中包括 sql 中的多个美元符号,所有这些都被转义了。 If I print out the actual command from the script and execute it manually it works perfectly.如果我从脚本中打印出实际命令并手动执行它,它就可以完美运行。 But when the perl script does it I get a syntax error.但是当 perl 脚本执行它时,我得到一个语法错误。 This is what I'm trying to execute, the printout from the command and then the sql error in turn, (I have assigned a $file in the script where it is inserting the data so that dollar sign doesn't get escaped below)这就是我要执行的,命令的打印输出,然后是 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,
  $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/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 compilation error: syntax error line 3 at position 4 unexpected '?'. SQL 编译错误:语法错误第 3 行位于 position 4 意外的“?”。 syntax error line 4 at position 13 unexpected '?'.语法错误第 4 行位于 position 13 意外的“?”。 syntax error line 4 at position 13 unexpected '?'.语法错误第 4 行位于 position 13 意外的“?”。

COPY INTO DWH_AIR.LND_APN.LND_STANDARD_IMP_EVENT FROM (
SELECT SPLIT_PART(METADATA$FILENAME,'/',4) as SEAT_ID,
  $1? as AUCTION_ID_64,
 DATEADD(S,$1?,'1970-01-01') as DATE_TIME,
 $1? as USER_TZ_OFFSET,
 $1? as CREATIVE_WIDTH,
 $1? as CREATIVE_HEIGHT

line 3 position 4 is the question mark after the '$1' on the 3rd line.第 3 行 position 4 是第 3 行“$1”之后的问号。 I don't get it, why is it removing the ':auction_id_64' part of the string?我不明白,为什么要删除字符串的“:auction_id_64”部分?

It looks like it is interpreting the: as a bind variable value, rather than a value in a variant.看起来它正在将: 解释为绑定变量值,而不是变体中的值。 Have you tried using the bracket notation, instead?您是否尝试过使用括号表示法?

https://docs.snowflake.com/en/user-guide/querying-semistructured.html#bracket-notation https://docs.snowflake.com/en/user-guide/querying-semistructured.html#bracket-notation

I believe it would look something like我相信它看起来像

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/pr/appnexus/data_dt=20220217/19/STANDARD_20220218012146.gz.parquet)
pattern = '.*.parquet'  file_format = (TYPE = 'PARQUET' SNAPPY_COMPRESSION = TRUE)
ON_ERROR = 'SKIP_FILE_10%';

I am uncertain whether this works or not, but if it doesn't, I will remove the answer.我不确定这是否有效,但如果无效,我将删除答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM