首页 > 解决方案 > 使用默认值填充雪花表而不从文件数据中选择默认列值

问题描述

我正在尝试动态加载表(删除表并加载数据 - 类似于截断和加载)。让我们假设表需要有 4 个字段,ID、Name、SeqNo 和 DtTimeStamp。

数据是从只有两个字段(ID 和名称)的外部暂存 csv\text 文件中选择的。下面的查询给出了许多列不匹配的错误。如何解决这个问题?

创建或替换表 SOMETABLENAME(ID NUMBER(38,0), Name VARCHAR(255), SeqNo NUMBER(38,0) NOT NULL AUTOINCREMENT, DtTimeStamp TIMESTAMP_NTZ(9) NOT NULL DEFAULT CURRENT_TIMESTAMP()) AS SELECT A.$1 AS ID , A.$2 AS 名称来自@EXTERNALSTAGE/SOME_FILE.CSV A;

如果您仔细查看上面的 SQL 语句,我的表有两个额外的字段需要为它加载的每一行自动填充。但我无法让它工作?

任何建议都受到高度赞赏。

提前致谢!沙迪亚

标签: sqlamazon-s3snowflake-cloud-data-platformstage

解决方案


创建表......作为选择(CTAS)

CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...

指定的列名数必须与查询中的 SELECT 列表项数匹配;列的类型是从查询产生的类型推断出来的。

为了解决它,CTAS 和 INSERT INTO 可以是两个独立的步骤:

CREATE OR REPLACE TABLE SOMETABLENAME(
    ID NUMBER(38,0),
    Name VARCHAR(255),
    SeqNo NUMBER(38,0) NOT NULL AUTOINCREMENT,
    DtTimeStamp TIMESTAMP_NTZ(9) NOT NULL DEFAULT CURRENT_TIMESTAMP()
);

-- here INSERT/SELECT have matching column list
INSERT INTO SOMETABLENAME(ID, Name)
SELECT A.$1 AS ID, A.$2 AS Name FROM @EXTERNALSTAGE/SOME_FILE.CSV A;

推荐阅读