如何在雪花任务创建中从不同的 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;