雪花合并命令在 ON 子句处返回无效标识符

时间:2021-01-18 09:20:21

标签: sql stored-procedures merge snowflake-cloud-data-platform

我正在尝试使用过程将阶段中的数据合并到现有表中。代码如下:

CREATE OR REPLACE PROCEDURE ADD_OBSERVATION_VALUES(FILE_FULL_PATH STRING, FILE_FORMAT_NAME STRING, 
                                                   OBSERVATION_DATE_POSITION FLOAT, LOCATION_POSITION FLOAT)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
try{
var observarion_query = "MERGE INTO HUB_OBSERVATION AS OBS "+
"USING (SELECT DATE(T.$"+OBSERVATION_DATE_POSITION+", 'DD/MM/YYYY'), T.$"+LOCATION_POSITION+" FROM "+FILE_FULL_PATH+"(FILE_FORMAT=>"+FILE_FORMAT_NAME+") T) ST "+
"ON md5(CONCAT(DATE(ST.$"+OBSERVATION_DATE_POSITION+", 'DD/MM/YYYY'), CONCAT('CAMP', ST.$"+LOCATION_POSITION+"))) = OBS.OBSERVATION_DATE_LOCATION_HASH_KEY "+
"WHEN MATCHED AND OBS.LOAD_END_DT=NULL THEN UPDATE SET OBS.LOAD_END_DT = CURRENT_TIMESTAMP() "+
"WHEN NOT MATCHED THEN "+
"INSERT (OBSERVATION_DATE_LOCATION_HASH_KEY, LOAD_DT, LOAD_END_DT, RECORD_SRC, OBSERVATION_DATE, LOCATION_NAME) "+
"VALUES (md5(CONCAT(ST.$"+OBSERVATION_DATE_POSITION+", CONCAT('CAMP', ST.$"+LOCATION_POSITION+"))), current_timestamp(), NULL, 'ONA', ST.$"+OBSERVATION_DATE_POSITION+", CONCAT('CAMP', ST.$"+LOCATION_POSITION+")) "

}
catch(error){
    return error;
}

调用过程时:

我收到以下错误:

<块引用>

SQL 编译错误:位置 14 处的第 3 行错误标识符无效 'ST.$7'

当我尝试在程序之外运行合并时:

MERGE INTO HUB_OBSERVATION AS OBS
USING (SELECT DATE(T.$7, 'DD/MM/YYYY'), T.$6 FROM @ingest_stage_temp/data.csv.gz (FILE_FORMAT=>"GENERIC_CSV_FORMAT") T) ST 
ON md5(CONCAT(ST.$7, CONCAT('CAMP', ST.$6))) = OBS.OBSERVATION_DATE_LOCATION_HASH_KEY 
WHEN MATCHED AND OBS.LOAD_END_DT=NULL THEN UPDATE SET OBS.LOAD_END_DT = CURRENT_TIMESTAMP()
WHEN NOT MATCHED THEN 
INSERT (OBSERVATION_DATE_LOCATION_HASH_KEY, LOAD_DT, LOAD_END_DT, RECORD_SRC, OBSERVATION_DATE, LOCATION_NAME) 
VALUES (md5(CONCAT(ST.$7, CONCAT('CAMP', ST.$6))), current_timestamp(), NULL, 'ONA', ST.$7, CONCAT('CAMP', ST.$6));

我遇到了同样的错误。

1 个答案:

答案 0 :(得分:3)

您必须在 TO_DATE 子句中为 USING 表达式提供别名,然后您可以在 USING 子句之外使用给定别名,如下所示:

....
....
USING (SELECT DATE(T.$7, 'DD/MM/YYYY') as $7 ... -- this
....
....