如何在雪花中调用另一个存储过程中的存储过程

Posted

技术标签:

【中文标题】如何在雪花中调用另一个存储过程中的存储过程【英文标题】:How to call a stored procedure inside another stored procedure in snowflake 【发布时间】:2021-09-27 17:07:43 【问题描述】:

我有一个存储过程 具有签名 SP1("TABLE_NAME") 的 SP1 SP1 会创建一个传递参数的表

我的第二个存储过程具有签名 SP2("PROCEDURE_NAME","PROCEDURE_PARAMETERS") 下面是 SP2 内部代码的 sn-p

v_sqlCode = `CALL ` + PROCEDURE_NAME + `(` + P_PROCEDURE_PARAMETERS + `)`;

try
var sqlStmt = snowflake.createStatement(sqlText : v_sqlCode);
var sqlRS = sqlSt,t.execute();


不幸的是,我不断收到 P_PROCEDURE_PARAMETER 的错误标识符无效

如果我这样做了 调用 SP2('SP1','C')

雪花会说无效标识符“C”有什么想法吗?

【问题讨论】:

当您转到 Snowflake History 选项卡时,SP 在尝试调用其他 SP 时尝试执行的 SQL 是什么样的? 【参考方案1】:

Snowflake 会说invalid identifier 'C'有什么想法吗?

案例很简单:

v_sqlCode = `CALL ` + PROCEDURE_NAME + `(` + P_PROCEDURE_PARAMETERS + `)`;

调用:CALL SP2('SP1','C') 变为:CALL SP1(C),而不是 CALL SP1('C')。这里C 是一个标识符,我猜你希望它是一个字符串文字

将参数作为字符串传递有潜在的危险,因为它容易发生 SQL 注入。


使用dollar-quoting拨打电话:

CALL SP2('SP1',$$'C'$$)

【讨论】:

以上是关于如何在雪花中调用另一个存储过程中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

可以从雪花中的函数调用存储过程吗

避免雪花中存储过程的重复

雪花:从另一个过程调用的带有 ARRAY 参数的过程

mssql 存储过程调用另一个存储过程中的结果的方法分享

如何获取雪花中执行存储过程的名称?

mssql 存储过程调用另一个存储过程中的结果的方法分享