我们可以在Snowflake中使用参数化视图吗?

时间:2019-10-25 10:12:38

标签: snowflake-data-warehouse

我们可以在Snowflake中使用参数化视图吗?例如将表名或数据库名作为参数传递,而不是对其进行硬编码?

4 个答案:

答案 0 :(得分:1)

我还没有找到一种执行此操作的方法,因此当我需要类似以下示例时,我就创建了过去称为“包装器视图”的示例。

我希望这对您有帮助...丰富

--create source tables and test records
CREATE TABLE t1 (id NUMBER, str VARCHAR);
CREATE TABLE t2 (id NUMBER, str VARCHAR);
CREATE TABLE t3 (id NUMBER, str VARCHAR);
INSERT INTO t1 VALUES(1, 'record from t1');
INSERT INTO t1 VALUES(2, 'record from t1');
INSERT INTO t2 VALUES(100, 'record from t2');
INSERT INTO t2 VALUES(101, 'record from t2');
INSERT INTO t3 VALUES(998, 'record from t3');
INSERT INTO t3 VALUES(999, 'record from t3');

--create the "wrapper" view
CREATE VIEW vw_t AS (
SELECT 't1' as table_name, * FROM t1
UNION ALL
SELECT 't2' as table_name, * FROM t2
UNION ALL 
SELECT 't3' as table_name, * FROM t3);

--try it out
SELECT * 
FROM   vw_t
WHERE  table_name = 't3';

--results
TABLE_NAME  ID     STR
t3          998    record from t3
t3          999    record from t3

答案 1 :(得分:1)

虽然在 Snowflake 上使用交互式 SQL worksheet 时,您可以这样做:

 SET target_table_name='myTable';
 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=$target_table_name 

这不会以编程方式工作。相反,如 here 所述,参数化查询(例如视图)使用以下语法:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=(?)

是的,第一个 (?) 参数的名称1

我正在研究我的 SnowflakeSQLHelper(Microsoft 模式和实践的改编版),这将在 attaching parameters 时有所帮助。

答案 2 :(得分:0)

我认为处理此类问题的最佳方法是创建一个UDTF,其行为类似于已被参数化的视图。因此,从本质上讲,您将像引用视图一样引用UDTF,并将参数传递到UDTF中,然后该UDTF将返回您希望使用的数据。请注意,Snowflake具有UDTF的2个选项(SQL和Javascript):

https://docs.snowflake.net/manuals/sql-reference/udf-table-functions.html https://docs.snowflake.net/manuals/sql-reference/udf-js-table-functions.html

答案 3 :(得分:0)

我认为您最好的选择是将session variables与常规视图结合使用。

会话变量可以在视图DDL中引用,并且需要在查询该视图的任何会话中进行设置。

为此,您可以使用Snowflake中的IDENTIFIER函数,该函数可将文本用作对象标识符。

create table t1 (col1 number, col2 number);
create table t2 (col1 number, col2 number);


set ti = 't1';
create view v1 as select col1, col2 from identifier($ti);

在查询视图之前,您需要将会话变量(在这种情况下为ti)设置为表名(如果需要,可以完全限定)。

set ti = 't1';
select * from v1; -- returns data from t1

set ti = 't2';
select * from v1; -- returns data from t2