Javascript Merge语句和存储过程

Javascript Merge语句和存储过程,javascript,stored-procedures,snowflake-cloud-data-platform,merge-statement,Javascript,Stored Procedures,Snowflake Cloud Data Platform,Merge Statement,我试图用Merge语句编写一个存储过程。 它看起来像这样: create or replace procedure database.events.insert_groupss() returns string LANGUAGE JAVASCRIPT as $$ var sql_cmd = 'Merge into database.events.groups et using (select lower(f.VALUE:id::string) as id,

我试图用Merge语句编写一个存储过程。 它看起来像这样:

create or replace procedure database.events.insert_groupss()
returns string
LANGUAGE JAVASCRIPT
as
$$
var sql_cmd = 'Merge into database.events.groups et using
        (select lower(f.VALUE:id::string) as id,
                min(f.VALUE:time_timestamp::timestamp) as event_timestamp,
                f.VALUE:service_string::string as service,
                f.VALUE:title_string::string as title,
                min(X.VALUE:created_at::timestamp) as title_ts ,
                X.VALUE:group::string as group
         from \'@database.sources.s3stage/version=3/stream=live/year=2019/month=12/\'
         (file_format => \'oak.public.JSON_FORMAT\' ), lateral flatten (input => $1:group_events, RECURSIVE => TRUE) f
         , LATERAL FLATTEN(parse_json(replace(replace(replace(replace(f.value:groups ,\'"[\', \'[\'),\'=>\',\':\'),\'\\\\\',\'\'),\']"\',\']\'))) x
          where id is not null and group is not null
          group by id,group,service,title)a
         on et.id=a.id and et.group = a.group
         when not matched then Insert (id , event_timestamp , service , title , title_ts ,group  )
                               values (a.id , a.event_timestamp , a.service , a.title , a.title_ts ,a.group  );';
try {

    snowflake.execute ({sqlText: sql_cmd});

    return "Succeeded";

    }

catch (err) {

    return "Failed: " + err;  // Return a success/error indicator.

    }
$$;
存储过程已创建,但如果我运行它,就会出现一些语法错误。当我使用存储过程手动运行它时,转义字符被转义,查询被执行

这是我得到的错误

JavaScript编译错误:未捕获语法错误:插入组中的“var sql\u cmd=”中的令牌无效或意外,使用“位置14”合并到database.events.GROUPS et中


问题在try子句中,SQL变量名称不正确。替换为下面的

snowflake.execute ({sqlText: sql_cmd})

问题在try子句中,SQL变量名称不正确。替换为下面的

snowflake.execute ({sqlText: sql_cmd})

问题是sql_cmd在多行中,所以需要连接,或者应该在单行中

create or replace procedure  database.events.insert_groupss()
returns string
LANGUAGE JAVASCRIPT
as
$$
var sql_cmd  = 'Merge into database.events.groups et using'
    sql_cmd += ' (select lower(f.VALUE:id::string) as id,'
    sql_cmd += ' min(f.VALUE:time_timestamp::timestamp) as event_timestamp,'
    sql_cmd += ' f.VALUE:service_string::string as service,'
    sql_cmd += ' f.VALUE:title_string::string as title,'
    sql_cmd += ' min(X.VALUE:created_at::timestamp) as title_ts ,'
    sql_cmd += ' X.VALUE:group::string as group'
    sql_cmd += ' from \'@database.sources.s3stage/version=3/stream=live/year=2019/month=12/\''
    sql_cmd += ' (file_format => \'oak.public.JSON_FORMAT\' ), lateral flatten (input => $1:group_events, RECURSIVE => TRUE) f'
    sql_cmd += ' , LATERAL FLATTEN(parse_json(replace(replace(replace(replace(f.value:groups ,\'"[\', \'[\'),\'=>\',\':\'),\'\\\\\',\'\'),\']"\',\']\'))) x'
    sql_cmd += ' where id is not null and group is not null'
    sql_cmd += ' group by id,group,service,title)a'
    sql_cmd += ' on et.id=a.id and et.group = a.group'
    sql_cmd += ' when not matched then Insert (id , event_timestamp , service , title , title_ts ,group  )'
    sql_cmd += ' values (a.id , a.event_timestamp , a.service , a.title , a.title_ts ,a.group  );";'
try {

    snowflake.execute ({sqlText: sql_cmd});

    return "Succeeded";

    }

catch (err) {

    return "Failed: " + err;  // Return a success/error indicator.

    }
$$;

问题是sql_cmd在多行中,所以需要连接,或者应该在单行中

create or replace procedure  database.events.insert_groupss()
returns string
LANGUAGE JAVASCRIPT
as
$$
var sql_cmd  = 'Merge into database.events.groups et using'
    sql_cmd += ' (select lower(f.VALUE:id::string) as id,'
    sql_cmd += ' min(f.VALUE:time_timestamp::timestamp) as event_timestamp,'
    sql_cmd += ' f.VALUE:service_string::string as service,'
    sql_cmd += ' f.VALUE:title_string::string as title,'
    sql_cmd += ' min(X.VALUE:created_at::timestamp) as title_ts ,'
    sql_cmd += ' X.VALUE:group::string as group'
    sql_cmd += ' from \'@database.sources.s3stage/version=3/stream=live/year=2019/month=12/\''
    sql_cmd += ' (file_format => \'oak.public.JSON_FORMAT\' ), lateral flatten (input => $1:group_events, RECURSIVE => TRUE) f'
    sql_cmd += ' , LATERAL FLATTEN(parse_json(replace(replace(replace(replace(f.value:groups ,\'"[\', \'[\'),\'=>\',\':\'),\'\\\\\',\'\'),\']"\',\']\'))) x'
    sql_cmd += ' where id is not null and group is not null'
    sql_cmd += ' group by id,group,service,title)a'
    sql_cmd += ' on et.id=a.id and et.group = a.group'
    sql_cmd += ' when not matched then Insert (id , event_timestamp , service , title , title_ts ,group  )'
    sql_cmd += ' values (a.id , a.event_timestamp , a.service , a.title , a.title_ts ,a.group  );";'
try {

    snowflake.execute ({sqlText: sql_cmd});

    return "Succeeded";

    }

catch (err) {

    return "Failed: " + err;  // Return a success/error indicator.

    }
$$;

感谢您更新的发现。尽管如此,它还是以同样的错误失败了。JavaScript编译错误:未捕获的语法错误:在'var sql_cmd='处插入_groupss中的无效或意外标记合并到database.events.groups et使用'position 14@RaviSatyaYenugula尝试使用我的新答案,在执行stoted过程之前确保Merge语句工作。感谢更新的查找。尽管如此,它还是以同样的错误失败了。JavaScript编译错误:未捕获的语法错误:在“var sql\u cmd=”处插入_groupss中的无效或意外标记使用“position 14@RaviSatyaYenugula”合并到database.events.groups et尝试我的新答案,在执行stoted过程之前,请确保merge语句正常工作。实际上,雪花SP支持带有反引号的行继续,正如您所做的,并记录在此处:,这使得维护更容易。当你这样做的时候,你不需要逃避其他的引用。我发现在将代码粘贴到web gui时,替换部分出现了一些错误。以交互方式运行代码,然后将其粘贴回SP,您将运行良好。@sriga,谢谢。是的,这是因为多行代码。使用+=附加它是一种痛苦的过程,我根据@erick引用使用了backquote`。实际上,雪花SP支持使用backquote继续行,正如您所做的,并记录在此处:,这使得维护更容易。当你这样做的时候,你不需要逃避其他的引用。我发现在将代码粘贴到web gui时,替换部分出现了一些错误。以交互方式运行代码,然后将其粘贴回SP,您将运行良好。@sriga,谢谢。是的,这是因为多行代码。根据@erick引用,使用+=附加它是一种痛苦的过程,我使用了backquote`。