Snowflake COPY:当我使用 MATCH_BY_COLUMN_NAME 选项时如何自动插入加载时间

问题描述 投票:0回答:1

我使用带有 MATCH_BY_COLUMN_NAME 选项的 Snowflake 副本。我们使用 MATCH_BY_COLUMN_NAME 是因为我们有一个非常长且不断变化的列名称列表。有没有办法在加载(或复制编译)时包含带有当前时间戳的 LOAD_TIME 字段?

我尝试添加一个

LOAD_TIME timestamp default current_timestamp() 
在目标表中,但由于 MATCH_BY_COLUMN_NAME,复制后我得到了 NULL 值。

请帮忙。谢谢你。

copy snowflake-cloud-data-platform
1个回答
2
投票

编辑:

复制到

INCLUDE_METADATA = (column_name = METADATA$field [,column_name = METADATA$field ...])

定义

目标表的现有列与其 METADATA$ 列之间的用户定义映射。此复制选项只能与 MATCH_BY_COLUMN_NAME 复制选项一起使用。 METADATA$ 字段的有效输入包括以下内容:

METADATA$FILENAME
METADATA$FILE_ROW_NUMBER
METADATA$FILE_CONTENT_KEY
METADATA$FILE_LAST_MODIFIED
METADATA$START_SCAN_TIME
COPY INTO table_name 
FROM @stage_name
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE
INCLUDE_METADATA = (LOAD_TIME = METADATA$START_SCAN_TIME);

这是默认行为,

COPY
将 NULL 插入到其他列中,并且不允许使用转换语法,因此即使定义了默认值也是 NULL。

COPY INTO t
FROM (SELECT CURRENT_TIMESTAMP() AS LOAD_TIME, ...
      FROM @stage)
MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
-- SQL compilation error: match_by_column_name is not supported with copy transform

复制到

MATCH_BY_COLUMN_NAME = CASE_SENSITIVE | CASE_INSENSITIVE | NONE

... 注意

  • 如果目标表中存在其他不匹配的列,COPY 操作会将 NULL 值插入到这些列中。这些列必须支持 NULL 值。

  • COPY 语句不允许在加载期间指定查询来进一步转换数据(即 COPY 转换)

© www.soinside.com 2019 - 2024. All rights reserved.