在 Snowflake 中处理多个 SQL 语句的存储过程
Posted
技术标签:
【中文标题】在 Snowflake 中处理多个 SQL 语句的存储过程【英文标题】:Stored procedure handling multiple SQL statements in Snowflake 【发布时间】:2021-04-20 18:42:55 【问题描述】:我正在 Snowflake 中创建一个存储过程,最终将被任务调用。
但是我收到以下错误:
不支持单个 API 调用中的多个 SQL 语句;每条语句使用一个 API 调用
并且不确定如何在我的 javascript 实现中处理建议的解决方案。
这就是我所拥有的
CREATE OR REPLACE PROCEDURE myStoreProcName()
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
var rs = snowflake.execute( sqlText:
`set curr_date = '2015-01-01';
CREATE OR REPLACE TABLE myTableName AS
with cte1 as (
SELECT
*
FROM Table1
where date = $curr_date
)
,cte2 as (
SELECT
*
FROM Table2
where date = $curr_date
)
select * from
cte1 as 1
inner join cte2 as 2
on(1.key = 2.key)
`
);
return 'Done.';
$$;
【问题讨论】:
每个 sql 语句都需要一条语句,例如“rs = snowflake.execute...”。您可以在 SP 中拥有任意数量的这些语句 是否会捕获我设置的变量并将其传播到其他查询? 两个 $$ 之间的所有内容都需要是一组有效的 javascript 语句 - 你不能只编写 SQL 语句。我认为您可能需要阅读文档,因为它提供了一些关于如何编写 SP 的好例子 感谢@NickW,我没有在文档中看到多 sql 查询存储 proc 示例。 【参考方案1】:您可以编写自己的辅助函数(用户的想法:waldente):
this.executeMany=(s) => s.split(';').map(sqlText => snowflake.createStatement(sqlText).execute());
executeMany('set curr_date = '2015-01-01';
CREATE OR REPLACE TABLE ...');
最后一条语句不应包含;
,如果在不用作分隔符的 DDL 中存在;
,它也可能会失败。
【讨论】:
【参考方案2】:你不能拥有:
var rs = snowflake.execute( sqlText:
`set curr_date = '2015-01-01';
CREATE OR REPLACE TABLE myTableName AS
...
`
相反,您需要拨打execute
两次(或更多次)。每个查询以 ;
结尾。
【讨论】:
以上是关于在 Snowflake 中处理多个 SQL 语句的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
如何在 powerBi 的高级编辑器中编写 Snowflake SELECT 语句查询
解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)