如何在雪花任务创建中从不同的 table 读取仓库名称
How to read warehouse name from a different table in snowflake task creation
我想创建一个雪花任务,通过查询另一个雪花 table,当前活动的仓库将分配给该任务。我想做这样的事情:
CREATE OR REPLACE TASK task_name
warehouse = {select query for different table}
schedule = '1 minute'
As
some SQL;
有人可以帮助我了解是否可以以及如何完成。
如果可以设置 SQL 变量,那么一种方法如下 -
Use/replace what-ever 在下面查询得到仓库名
set my_wh=(select current_warehouse());
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
select $my_wh;
+------------+
| $MY_WH |
|------------|
| COMPUTE_WH |
+------------+
CREATE TASK t1
warehouse = $my_wh
SCHEDULE = '1 minute'
AS
INSERT INTO emp(empid, time_added) VALUES(100,CURRENT_TIMESTAMP);
+-------------------------------+
| status |
|-------------------------------|
| Task T1 successfully created. |
+------------------------
建立它:
SELECT CURRENT_WAREHOUSE();
给出:
CURRENT_WAREHOUSE()
COMPUTE_WH
BEGIN
let task_sql text := 'SELECT 1';
let sql text := 'CREATE OR REPLACE TASK task_name warehouse = ' || CURRENT_WAREHOUSE() || ' schedule = ''1 minute'' AS ' || task_sql;
return sql;
END;
给出:
anonymous block
CREATE OR REPLACE TASK task_name warehouse = COMPUTE_WH schedule = '1 minute' AS SELECT 1
如果我们测试:
CREATE OR REPLACE TASK task_name warehouse = COMPUTE_WH schedule = '1 minute' AS SELECT 1;
工作正常。
status
Task TASK_NAME successfully created.
因此:
BEGIN
let task_sql text := 'SELECT 1';
let sql text := 'CREATE OR REPLACE TASK task_name warehouse = ' || CURRENT_WAREHOUSE() || ' schedule = ''1 minute'' AS ' || task_sql;
EXECUTE IMMEDIATE sql;
return sql;
END;
也很好用:
describe task task_name;
created_on
name
id
database_name
schema_name
owner
comment
warehouse
schedule
predecessors
state
definition
condition
allow_overlapping_execution
2022-04-04 17:06:17.858 -0700
TASK_NAME
01a36466-6310-6f1f-0000-000000000002
TEST
TEST
ACCOUNTADMIN
COMPUTE_WH
1 minute
suspended
SELECT 1
false
如果你想让任务为每个 运行 选择一个活动仓库,恐怕这是不可能的(不过这将是一个可爱的功能)。
但是如果你想使用在创建时处于活动状态的仓库,这对我来说没有多大意义,那么我会选择这样的东西:
show warehouses;
set wh = (select top 1 "name" from table(result_scan(last_query_id())) where "state" = 'STARTED');
CREATE TASK task_name
warehouse = $wh
SCHEDULE = '1 minute'
AS
select 1;
我想创建一个雪花任务,通过查询另一个雪花 table,当前活动的仓库将分配给该任务。我想做这样的事情:
CREATE OR REPLACE TASK task_name
warehouse = {select query for different table}
schedule = '1 minute'
As
some SQL;
有人可以帮助我了解是否可以以及如何完成。
如果可以设置 SQL 变量,那么一种方法如下 - Use/replace what-ever 在下面查询得到仓库名
set my_wh=(select current_warehouse());
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
select $my_wh;
+------------+
| $MY_WH |
|------------|
| COMPUTE_WH |
+------------+
CREATE TASK t1
warehouse = $my_wh
SCHEDULE = '1 minute'
AS
INSERT INTO emp(empid, time_added) VALUES(100,CURRENT_TIMESTAMP);
+-------------------------------+
| status |
|-------------------------------|
| Task T1 successfully created. |
+------------------------
建立它:
SELECT CURRENT_WAREHOUSE();
给出:
CURRENT_WAREHOUSE() |
---|
COMPUTE_WH |
BEGIN
let task_sql text := 'SELECT 1';
let sql text := 'CREATE OR REPLACE TASK task_name warehouse = ' || CURRENT_WAREHOUSE() || ' schedule = ''1 minute'' AS ' || task_sql;
return sql;
END;
给出:
anonymous block |
---|
CREATE OR REPLACE TASK task_name warehouse = COMPUTE_WH schedule = '1 minute' AS SELECT 1 |
如果我们测试:
CREATE OR REPLACE TASK task_name warehouse = COMPUTE_WH schedule = '1 minute' AS SELECT 1;
工作正常。
status |
---|
Task TASK_NAME successfully created. |
因此:
BEGIN
let task_sql text := 'SELECT 1';
let sql text := 'CREATE OR REPLACE TASK task_name warehouse = ' || CURRENT_WAREHOUSE() || ' schedule = ''1 minute'' AS ' || task_sql;
EXECUTE IMMEDIATE sql;
return sql;
END;
也很好用:
describe task task_name;
created_on | name | id | database_name | schema_name | owner | comment | warehouse | schedule | predecessors | state | definition | condition | allow_overlapping_execution |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2022-04-04 17:06:17.858 -0700 | TASK_NAME | 01a36466-6310-6f1f-0000-000000000002 | TEST | TEST | ACCOUNTADMIN | COMPUTE_WH | 1 minute | suspended | SELECT 1 | false |
如果你想让任务为每个 运行 选择一个活动仓库,恐怕这是不可能的(不过这将是一个可爱的功能)。
但是如果你想使用在创建时处于活动状态的仓库,这对我来说没有多大意义,那么我会选择这样的东西:
show warehouses;
set wh = (select top 1 "name" from table(result_scan(last_query_id())) where "state" = 'STARTED');
CREATE TASK task_name
warehouse = $wh
SCHEDULE = '1 minute'
AS
select 1;