Snowflake存储过程内调用另一存储过程报标识符无效错误如何解决?
问题根因
报错的核心原因是动态SQL拼接时未给字符串类型参数添加单引号:当你执行CALL SP2('SP1','C')时,最终拼接生成的SQL语句为CALL SP1(C),Snowflake会将无引号包裹的C识别为对象标识符(如列名、变量名)而非字符串常量,因此触发无效标识符报错。
此外你提供的SP2代码存在笔误:var sqlRS = sqlSt,t.execute();中多了一个逗号,需修正为var sqlRS = sqlStmt.execute();否则执行时会抛出语法错误。
解决方案
你可以根据使用场景选择以下任意一种方式修复:
- 方式1:调用SP2时手动转义参数的单引号
直接调整调用语句为:
Snowflake中两个连续的单引号会被转义为单个单引号,最终拼接生成的SQL为CALL SP2('SP1','''C''');CALL SP1('C'),符合SP1的参数传参要求。 - 方式2:修改SP2的动态SQL拼接逻辑,自动添加单引号
调整SP2中SQL拼接的代码行,同时增加单引号转义逻辑避免参数本身带单引号时出错:v_sqlCode = `CALL ` + PROCEDURE_NAME + `('` + P_PROCEDURE_PARAMETERS.replace(/'/g, "''") + `')`; try{ var sqlStmt = snowflake.createStatement({sqlText : v_sqlCode}); var sqlRS = sqlStmt.execute(); } - 方式3:改用绑定变量传参,彻底避免引号处理问题
如果后续需要支持多参数、不同数据类型的参数传递,推荐使用绑定变量的写法,完全规避手动拼接SQL的引号问题:v_sqlCode = `CALL IDENTIFIER(?) (?)`; try{ var sqlStmt = snowflake.createStatement({ sqlText : v_sqlCode, binds: [PROCEDURE_NAME, P_PROCEDURE_PARAMETERS] }); var sqlRS = sqlStmt.execute(); }
修改完成后重新执行调用,即可正常触发SP1创建对应表,不会再报无效标识符错误。
内容的提问来源于stack exchange,提问作者PayrollPaul
相关产品推荐
相关产品推荐

