在复制到命令时使用 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%';

我不确定这是否有效,但如果无效,我将删除答案。