在 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 语句的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

识别多个表 Snowflake SQL 之间的唯一列

如何在 powerBi 的高级编辑器中编写 Snowflake SELECT 语句查询

解析 JSON 时出错:输入中有多个文档(Redshift 到 Snowflake SQL)

Snowflake:SQL 编译错误:不是有效的 group by 表达式

在雪花中放置多个仓库的最佳方法?

雪花存储过程多语句列表参数