我们可以在Snowflake中使用参数化视图吗?例如将表名或数据库名作为参数传递,而不是对其进行硬编码?
答案 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