Snowflake中get_ddl返回存储过程DDL时出现多余单引号问题求助
解决Snowflake GET_DDL返回存储过程DDL时的格式问题
你遇到的两个现象是Snowflake的默认行为,但可以通过以下方式调整:
1. 移除标识符的双引号
Snowflake会将未加引号的小写标识符自动转为大写,GET_DDL为了保留标识符的大小写匹配规则,会用双引号包裹这些标识符。你可以通过两种方式处理:
- 方式一:创建时使用大写标识符
直接用大写名称创建存储过程,GET_DDL返回的DDL就不会带双引号:CREATE PROCEDURE STACK_OVERFLOW_QUESTION(SELECT_TABLE VARCHAR) RETURNS VARCHAR LANGUAGE SQL AS DECLARE select_statement VARCHAR; BEGIN select_statement := ' SELECT * FROM ' || :SELECT_TABLE || ' '; END; - 方式二:用REPLACE清洗DDL结果
执行GET_DDL时嵌套REPLACE函数去掉双引号:SELECT REPLACE(REPLACE(GET_DDL('PROCEDURE', 'STACK_OVERFLOW_QUESTION(VARCHAR)'), '"', ''), '"', '') AS cleaned_ddl;
2. 消除多余的单引号转义
存储过程AS块内的单引号被转成双单引号,是SQL语法的强制要求——单引号包裹的字符串内部单引号必须用双单引号转义。要避免这种情况,推荐使用分隔符引用创建存储过程:
CREATE PROCEDURE stack_overflow_question(select_table varchar) returns varchar language sql AS $$ DECLARE select_statement varchar; BEGIN select_statement := ' SELECT * FROM ' || :select_table || ' '; END; $$;
用$$作为AS块的分隔符时,内部单引号无需转义,后续用GET_DDL获取的DDL会保留$$分隔符,不会出现双单引号:
SELECT GET_DDL('PROCEDURE', 'stack_overflow_question(varchar)');
返回的DDL格式更简洁:
CREATE OR REPLACE PROCEDURE "STACK_OVERFLOW_QUESTION"("SELECT_TABLE" VARCHAR(16777216)) RETURNS VARCHAR(16777216) LANGUAGE SQL EXECUTE AS OWNER AS $$ declare select_statement varchar; begin select_statement := ' SELECT * FROM ' || :select_table || ' '; end; $$;
如果要处理已有的双单引号,也可以用REPLACE函数替换:
SELECT REPLACE(GET_DDL('PROCEDURE', 'STACK_OVERFLOW_QUESTION(VARCHAR)'), '''''', '''') AS cleaned_ddl;
内容的提问来源于stack exchange,提问作者alexspurlock
相关产品推荐
相关产品推荐

