如何在Snowflake SQL存储过程中编写多行查询语句
Snowflake SQL存储过程中编写多行查询的解决方法
Snowflake的SQL存储过程不支持JavaScript的反引号多行字符串语法,你可以通过以下两种方式实现多行SQL字符串的定义:
方法1:单引号直接包裹多行内容
直接用单引号将整个多行SQL语句包裹,只要保证字符串整体闭合即可,换行不会影响解析。注意字符串内部的单引号需要用双单引号转义,日期值必须用单引号包裹(避免被解析为算术运算)。
修正后的代码:
create or replace procedure create_src_table() returns table (name varchar, age number(10,0),dob date) language sql as $$ declare create_query varchar; res resultset; begin create_query := 'CREATE TEMPORARY TABLE SRC_TEMP_TBL AS SELECT * FROM (WITH CTE_1 AS (SELECT * FROM "DB"."DW"."USER_TBL" WHERE name=''rahul''), CTE_2 AS (SELECT * FROM CTE_1 WHERE CAST(DOB AS DATE) < ''2000-05-01'') SELECT name,age,dob FROM CTE_2 limit 10)'; res := (execute immediate :create_query); return table(res); end; $$; call create_src_table();
方法2:用字符串连接符||拼接多行
将每行SQL片段用单引号包裹,再通过Snowflake的字符串连接运算符||拼接成完整语句,适合需要拆分长SQL的场景。
示例代码:
create or replace procedure create_src_table() returns table (name varchar, age number(10,0),dob date) language sql as $$ declare create_query varchar; res resultset; begin create_query := 'CREATE TEMPORARY TABLE SRC_TEMP_TBL AS SELECT * FROM ' || '(WITH CTE_1 AS (SELECT * FROM "DB"."DW"."USER_TBL" WHERE name=''rahul''), ' || 'CTE_2 AS (SELECT * FROM CTE_1 WHERE CAST(DOB AS DATE) < ''2000-05-01'') ' || 'SELECT name,age,dob FROM CTE_2 limit 10)'; res := (execute immediate :create_query); return table(res); end; $$; call create_src_table();
关键注意事项
- 字符串内部的单引号必须转义:比如原SQL中的
name='rahul'要写成name=''rahul'' - 日期值必须用单引号包裹:
CAST(DOB AS DATE) < '2000-05-01',否则2000-05-01会被解析为算术表达式(结果为1994),导致逻辑错误 execute immediate后的变量无需空格,规范写法是:create_query而非: create_query
内容的提问来源于stack exchange,提问作者sa_
相关产品推荐
相关产品推荐

