Snowflake SQL存储过程中使用MERGE语句出现语法错误求助
Snowflake SQL存储过程中MERGE语句语法错误解决方法
问题代码
CREATE OR REPLACE PROCEDURE "USP_TEST"("FILE_DATE_TIME" VARCHAR(1000)) RETURNS VARCHAR(16777216) LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE SRC_ID varchar(10000); BEGIN SRC_ID:= <Some Select query>; merge into table a using ()b on <some join conditions> when matched then update <x no of statements> when not matched then insert <x no of statements> ; RETURN 'SUCCESS' END; $$
错误信息
syntax error line 8 at position 7 unexpected 'into'. syntax error line 8 at position 15 unexpected '.'
错误原因及修正方案
- 冗余
table关键字:merge into table a里的table是无效语法,Snowflake的MERGE语句不需要在表名前加table,直接写目标表名即可(若表属于特定schema,需写成schema_name.a)。 - USING子句格式错误:
using ()b写法不合法,USING后必须跟随合法数据源(子查询、表、视图等),比如基于变量的子查询需写成(SELECT ... FROM ... WHERE id = :SRC_ID) b。 - 变量引用规则:在MERGE的子查询中引用存储过程变量时,必须添加冒号
:前缀(例如:SRC_ID)。
修正后的示例代码
CREATE OR REPLACE PROCEDURE "USP_TEST"("FILE_DATE_TIME" VARCHAR(1000)) RETURNS VARCHAR(16777216) LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE SRC_ID varchar(10000); BEGIN -- 示例:为SRC_ID赋值,子查询需用括号包裹 SRC_ID := (SELECT some_column FROM source_table WHERE file_datetime = :FILE_DATE_TIME); -- 修正后的MERGE语句 MERGE INTO a USING ( -- 替换为实际的源数据查询,可引用存储过程变量 SELECT id, col1, col2 FROM source_table WHERE id = :SRC_ID ) b ON a.id = b.id -- 替换为实际连接条件 WHEN MATCHED THEN UPDATE SET a.col1 = b.col1, a.col2 = b.col2 -- 替换为实际更新字段 WHEN NOT MATCHED THEN INSERT (id, col1, col2) -- 替换为目标表字段列表 VALUES (b.id, b.col1, b.col2); -- 对应源表字段值 RETURN 'SUCCESS'; END; $$
内容的提问来源于stack exchange,提问作者Naveen Srikanth
相关产品推荐
相关产品推荐

