You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:25:19