Snowflake存储过程导出数据到Azure Blob报错排查请求
解决Snowflake存储过程中COPY INTO的JavaScript语法错误
这个问题我之前也碰到过!核心原因是JavaScript字符串的单引号冲突,咱们一步步来拆解和解决:
错误根源
你的存储过程用JavaScript编写,sqlText是用单引号'包裹的,但SQL语句里也大量使用了单引号(比如日期'2020-09-01'、FILE_FORMAT中的'CSV')。这些内部的单引号会被JavaScript误判为字符串的结束标记,直接导致语法解析失败,也就是你看到的SyntaxError: Invalid or unexpected token。
修复方案(推荐第一种)
方案1:使用JavaScript模板字符串(反引号包裹)
把sqlText的包裹方式从单引号改成反引号`,这样内部的单引号就不会和外层冲突,同时还能让SQL代码格式更清晰,可读性更强。
方案2:转义内部单引号
把SQL语句里的每个单引号'替换成\',不过这种方式会让代码变得杂乱,维护起来很麻烦,不推荐。
修正后的完整存储过程代码
CREATE or REPLACE PROCEDURE TST_30102020() RETURNS VARCHAR LANGUAGE JAVASCRIPT EXECUTE AS CALLER AS $$ var stmt = snowflake.createStatement({ sqlText:`COPY INTO @storage/folder/file_1.csv FROM ( SELECT t1.ATTR,t1.ATTR, t2.ATTR, t2.ATTR, t1.ATTR, t1.MIASTO, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.KONCESJA_A, t1.ATTR, t1.ATTR FROM t1 LEFT JOIN (SELECT * FROM table WHERE ATTR >= '2020-09-01') AS t2 ON t1.ATTR= t2.ATTR AND t1.ATTR= t2.ATTR LEFT JOIN (SELECT * FROM table WHERE ATTR>= '2020-09-01') AS t3 ON t2.ATTR= t3.ATTR AND t2.ATTR= t3.ATTR AND t2.ATTR= t3.ATTR WHERE t2.ATTR> 0 ORDER BY t2.ATTR, t1.ATTR ) FILE_FORMAT = (TYPE = 'CSV') OVERWRITE = TRUE SINGLE = TRUE MAX_FILE_SIZE = 170000000` }); try { stmt.execute(); return "Succeeded."; } catch (err) { return "Failed: " + err; } $$;
额外提示
以后在JavaScript中编写包含单引号的SQL语句时,优先用模板字符串,既能避免语法错误,又能让代码结构更清晰,方便后续维护。
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

