在 UDF 或存储过程中使用参数返回表
Posted
技术标签:
【中文标题】在 UDF 或存储过程中使用参数返回表【英文标题】:Use parameter in UDF or Stored Procedure to return table 【发布时间】:2021-10-27 08:26:38 【问题描述】:我有一个使用 Snowflake API 的案例。我们有一堆物化视图,对于我们的每个客户都有多个。在使用 API 时,我们希望使用函数或存储过程在运行时产生结果,并以客户 ID 作为参数。此参数将用于从正确的视图中获取数据,以避免每个客户端都有功能。但是,我遇到了一些问题:
SQL UD(T)F 不起作用,因为您似乎不能 在 FROM 子句中使用参数。你也不能使用变量或 如果我理解正确,运行多个语句。 JavaScript UD(T)F 不起作用,因为您不允许执行 声明。 存储过程适用于单个值(这是一种用途 case),但不适用于返回表格。它可以返回一个 VARIANT,但是 这将在使用我们的 API 的服务中添加工作 想避免。您对如何实现我们所追求的结果有什么建议吗?我们可以使用我们所追求的结果创建预先计算的视图,但这会导致大量视图,因为我们还需要 API 中的其他参数来获得动态(过滤)结果。因此,基于函数的方法似乎更加简洁且易于维护。
感谢您的帮助和支持!
【问题讨论】:
能否用SP建一个包含结果的表,以便SP完成后可以访问? 【参考方案1】:如果每个客户端的视图结构相同,您可以使用 UNION ALL 执行 UDTF,合并所有视图并仅过滤您需要的视图。 在实践中,您将始终根据参数只读取一个视图。
类似的东西:
create function t(Client varchar)
returns table(col1 varchar, col2 varchar)
as
$$
SELECT col1, col2
FROM ViewClient1
WHERE Client = 'Client1'
UNION ALL
SELECT col1, col2
FROM ViewClient2
WHERE Client = 'Client2'
UNION ALL
SELECT col1, col2
FROM ViewClient3
WHERE Client = 'Client3'
$$;
【讨论】:
【参考方案2】:可以使用Snowflake Scripting存储过程。
create or replace procedure test_sp_dynamic(table_name string)
returns table(col varchar, col2 varchar)
language sql
as
$$
declare
res RESULTSET;
query VARCHAR DEFAULT 'SELECT Y, Z FROM TABLE(?)';
begin
res := (execute immediate :query using (TABLE_NAME));
return table(res);
end;
$$;
测试数据:
CREATE OR REPLACE TABLE view_1(Y VARCHAR, Z VARCHAR) AS SELECT 1, 2;
CREATE OR REPLACE TABLE view_2(Y VARCHAR, Z VARCHAR) AS SELECT 3, 4 ;
CALL test_sp_dynamic('VIEW_1');
-- 1 2
CALL test_sp_dynamic('VIEW_2');
-- 3 4
【讨论】:
以上是关于在 UDF 或存储过程中使用参数返回表的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server StoredProc 与 UDF 内联表