如何从Snowflake获取可直接执行调试的存储过程定义?
如何从Snowflake获取与创建格式一致的存储过程定义用于测试调试
可以实现,Snowflake提供了两种常用方法来获取可直接复用、内部SQL能正常执行的存储过程定义,解决转义单引号的问题:
方法1:使用GET_DDL函数搭配字符串替换
GET_DDL函数会返回存储过程的完整定义,但其中的单引号会被转义为两个单引号(''),我们只需要将其替换回单个单引号(')即可:
SELECT REPLACE(GET_DDL('PROCEDURE', 'FRED()'), '''''', '''') AS FORMATTED_PROCEDURE_DDL;
执行这个查询后,得到的结果就是和创建时格式一致的DDL,内部的SELECT语句可以直接复制出来执行测试。
方法2:查询信息架构视图并自定义拼接
通过INFORMATION_SCHEMA.PROCEDURES视图提取存储过程的元数据,手动拼接DDL并处理转义单引号:
SELECT REPLACE( CONCAT( 'CREATE OR REPLACE PROCEDURE ', PROCEDURE_NAME, '()', CHAR(10), 'RETURNS ', DATA_TYPE, CHAR(10), 'LANGUAGE ', LANGUAGE, CHAR(10), 'EXECUTE AS ', EXECUTION_CONTEXT, CHAR(10), 'AS', CHAR(10), PROCEDURE_DEFINITION ), '''''', '''' ) AS FORMATTED_PROCEDURE_DDL FROM INFORMATION_SCHEMA.PROCEDURES WHERE PROCEDURE_NAME = 'FRED';
这种方式可以自定义DDL的排版格式,更贴近你最初创建存储过程时的写法。
问题原因说明
Snowflake在存储存储过程定义时,会将定义体中的单引号转义为两个单引号(这是SQL字符串的标准转义规则),所以直接查询得到的定义里会出现''J%''这类写法。当你直接复制其中的SQL语句执行时,解析器会错误识别转义符,导致语法错误。通过替换操作恢复为单个单引号后,SQL语句就能正常解析执行。
内容的提问来源于stack exchange,提问作者ozhug
相关产品推荐
相关产品推荐

