Snowflake - 插入后如何处理错误的虚拟列?
Snowflake - How do I handle a bad Virtual Column after it is INSERTed?
令我惊讶的是,我可以插入导致虚拟列变坏的行。那么如何检测错误的虚拟列并进行处理(尤其是在代码中)?
CREATE TABLE TEST
(
REC_DATE VARCHAR2(500),
REC_TIME VARCHAR2(500),
REC_DATETIME DATETIME AS TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS' )
);
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '02:22:22' );
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '03/03/2023', '03:33:33' );
然后插入导致错误虚拟列的错误行:
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '99:22:22' );
SELECT * FROM TEST;
你应该得到这个错误:
"SQL 编译错误:错误行 1 在位置 7 无效标识符 'TEST'"
我想知道您将如何检测和清除坏行,尤其是在数据很多的情况下?
解决此问题的一种快速方法是对虚拟列使用安全定义。
第 1 步:删除虚拟列。
第 2 步:使用安全操作重新创建虚拟列 — 使用 TRY_TO_TIMESTAMP
.
而不是 TO_TIMESTAMP
alter table test
drop column rec_datetime
;
alter table test
add column REC_DATETIME DATETIME AS try_TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS' )
;
select * from test;
要识别坏行,您可以在应用之前的修复后查找空行:
select * from test
where rec_date is not null
and rec_datetime is null
令我惊讶的是,我可以插入导致虚拟列变坏的行。那么如何检测错误的虚拟列并进行处理(尤其是在代码中)?
CREATE TABLE TEST
(
REC_DATE VARCHAR2(500),
REC_TIME VARCHAR2(500),
REC_DATETIME DATETIME AS TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS' )
);
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '02:22:22' );
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '03/03/2023', '03:33:33' );
然后插入导致错误虚拟列的错误行:
INSERT INTO TEST ( REC_DATE, REC_TIME ) VALUES ( '02/02/2022', '99:22:22' );
SELECT * FROM TEST;
你应该得到这个错误:
"SQL 编译错误:错误行 1 在位置 7 无效标识符 'TEST'"
我想知道您将如何检测和清除坏行,尤其是在数据很多的情况下?
解决此问题的一种快速方法是对虚拟列使用安全定义。
第 1 步:删除虚拟列。
第 2 步:使用安全操作重新创建虚拟列 — 使用 TRY_TO_TIMESTAMP
.
TO_TIMESTAMP
alter table test
drop column rec_datetime
;
alter table test
add column REC_DATETIME DATETIME AS try_TO_TIMESTAMP( REC_DATE || ' ' || REC_TIME, 'DD/MM/YYYY HH24:MI:SS' )
;
select * from test;
要识别坏行,您可以在应用之前的修复后查找空行:
select * from test
where rec_date is not null
and rec_datetime is null