雪花的get_ddl到处显示额外的单引号



在Snowflake中,当我创建这样一个存储过程时:

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;

然后,当我使用select get_ddl('procedure', 'stack_overflow_question(varchar)');函数对存储过程进行编辑时,这个函数调用的结果有额外的单引号。

结果如下

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';

注意两者的区别!额外的单引号。在存储过程的名称中也使用双引号。

我能做些什么来防止这种情况发生吗?我用的是Snowsight——但我不认为这就是问题所在。另外,我使用snowflake作为存储过程的语言。

任何想法?

我编写了一个UDF,您可以将它括在get_ddl周围,它将DDL从使用双单引号转换为单引号,并将主体用$$:

create or replace function CODE_DDL_TO_TEXT(CODE_TEXT string)
returns string
language javascript
as
$$
var lines = CODE_TEXT.split("n");
var out = "";
var startCode = new RegExp("^AS '$", "ig");
var endCode = new RegExp("^';$", "ig");
var inCode = false;
var isChange = false;
var s;
for (i = 0; i < lines.length; i++){
isChange = false;
if(!inCode) {
inCode = startCode.test(lines[i]);
if(inCode) {
isChange = true;
out += "AS $" + "$n";
}
}
if (endCode.test(lines[i])){
out += "$" + "$;";
isChange = true;
inCode = false;
}
if(!isChange){
if(inCode){
s = lines[i].replace(/''/g, "'") + "n";
s = s.replace(/\\/g, "\");
out += s;
} else {
out += lines[i] + "n";
}
}
}
return out;
$$;

然后可以通过将UDF包装在get_ddl函数周围来调用它。下面是一个从get_ddl:

中获取自己的DDL的示例
select CODE_DDL_TO_TEXT(get_ddl('function', 'CODE_DDL_TO_TEXT(string)'));

编辑:

还可以使用此SQL从INFORMATION_SCHEMA:

重构存储过程。
select  'create or replace procedure ' || PROCEDURE_NAME || ARGUMENT_SIGNATURE || 
'nreturns ' || DATA_TYPE || 
'nlanguage ' || PROCEDURE_LANGUAGE || 
'nas $' || '$n' || 
PROCEDURE_DEFINITION || 
'n$' || '$;'
from INFORMATION_SCHEMA.PROCEDURES
;

这只返回body -

SELECT PROCEDURE_DEFINITION
FROM INFORMATION_SCHEMA。程序WHERE PROCEDURE_SCHEMA = 'SCHEMA_NAME' AND PROCEDURE_NAME = upper('stack_overflow_question');

最新更新