【问题标题】:How To Get Snowflake Stored Procedure DDL with $$如何使用 $$ 获取雪花存储过程 DDL
【发布时间】:2020-09-28 02:34:11
【问题描述】:

我们更喜欢使用 $$ 表示法对 Snowflake 存储过程和 javascript UDF 进行编码。这更容易,因为我们不必担心转义代码中的每个单引号。但是,当我们使用 GET_DDL 检索 DDL 时,Snowflake 会删除 $$ 并将 SP 的主体放在单引号中,并且还会转义每个单引号。

有没有办法从 Snowflake 中获取 $$ 格式的 SP DDL?

例如,下面是我们创建的 SP。注意 $$ 符号,我们没有

CREATE OR REPLACE PROCEDURE "SP_TEST"()
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS $$
    var result = snowflake.execute({sqlText: "select 'Hello World!' as test;"})
    result.next();
    return String(result.getColumnValue(1));
$$;

然后,当我们使用 SELECT GET_DDL('PROCEDURE','SP_TEST()') 从 Snowflake 检索 DDL 时,我们得到以下信息。请注意 $$ 已被单引号替换,并且所有其他单引号现在都已转义。

CREATE OR REPLACE PROCEDURE "SP_TEST"()
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS '


    var result = snowflake.execute({sqlText: "select ''Hello World!'' as test;"})
    result.next();
    return String(result.getColumnValue(1));
';

谢谢

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    我还没有找到一种内置的方法来做到这一点,但您可以使用 UDF 来做到这一点。如果代码部分的 $$ 开始和结束总是在自己的行上,这应该可以工作:

    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;
    $$;
    
    select CODE_DDL_TO_TEXT(get_ddl('function', 'CODE_DDL_TO_TEXT(string)'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2021-06-22
      • 1970-01-01
      • 2020-05-23
      • 2021-07-12
      • 2021-02-20
      相关资源
      最近更新 更多