终端可正常运行的查询在JavaScript Snowflake存储过程中报语法错误
问题原因与解决方案
问题出在转义字符的双重解析上:
- 终端执行SQL时,仅需遵循SQL自身的转义规则:单个
\要写成\\,两个\要写成\\\\。 - 但把SQL嵌入JavaScript存储过程时,JavaScript会先解析字符串里的转义字符,之后Snowflake的SQL解析器会再做一次解析。两层转义叠加,导致原SQL的转义格式不符合要求。
修正后的SQL语句(嵌入JS存储过程时)
// 用模板字符串包裹SQL,注意反斜杠的双重转义 const sql = `SELECT replace('[[:space:]]+('||listagg(keyword, '|')||')[[:space:]]+', '\\\\', '\\\\\\\\') as pattern FROM qwerty;`;
关键说明
- 原SQL里的
'\\'(对应传给replace的单个\),在JS字符串中要写成'\\\\':JS解析后变为'\\',再经SQL解析器处理成单个\。 - 原SQL里的
'\\\\'(对应传给replace的两个\),在JS字符串中要写成'\\\\\\\\':JS解析后变为'\\\\',再经SQL解析器处理成两个\。
内容的提问来源于stack exchange,提问作者VVictor
相关产品推荐
相关产品推荐

