雪花,任务和会话变量问题

时间:2019-11-01 09:47:58

标签: stored-procedures task session-variables snowflake-data-warehouse

我在Snowflake中遇到了一个问题,该任务执行存储过程,并且SP正在使用我想用于记录目的的会话变量QUERY_TAG。 当Task执行SP时,我会收到错误消息: “会话变量'$ QUERY_TAG'不存在” 执行作为呼叫者 不管在哪里尝试设置QUERY_TAG(在第一个Task前置代码或定义中)都没有关系。

任务和SP由我创建为SYSADMIN

当我在查询编辑器(Snowflake,DBeaver等)中执行SP时,它运行良好,因此SP中没有编码错误。 SET QUERY_TAG ='一个不错的查询标签' 致电TASK_SCHEMA.SP_TASK_ONE()

当我在Worksheet或DBeaver或类似程序中调用它时,它运行良好。 SP中的两种方式都可以工作(内联SQL或通过getQueryTag函数)

这是任务和SP的代码

CREATE OR REPLACE TASK TASK_SCHEMA.TASK_ONE_PRECOND
    WAREHOUSE = TASK_WH
    SCHEDULE = '2 minute'
    QUERY_TAG = 'My Query Tag'
AS
    SET QUERY_TAG = 'My Query Tag 2'


CREATE OR REPLACE TASK TASK_SCHEMA.TASK_ONE
    WAREHOUSE = TASK_WH
    AFTER TASK_SCHEMA.TASK_ONE_PRECOND
AS
    CALL TASK_SCHEMA.SP_TASK_ONE()


create or replace procedure TASK_SCHEMA.SP_TASK_ONE()
    RETURNS VARCHAR(50)
    LANGUAGE JAVASCRIPT
    EXECUTE AS CALLER
as $$    

function getQueryTag()
{
    var QueryTag;
    rs_QT = snowflake.execute ( { sqlText: `SELECT $QUERY_TAG;` }  );
    if( rs_QT.next())
    {
        QueryTag = rs_QT.getColumnValue(1); // get the QueryTag
    }

    return QueryTag; 
}   

    var qtag = getQueryTag();

    //rs = snowflake.execute ( { sqlText: 
    //`INSERT INTO "LOG"."TESTSESSIONLOG"
    //  ("SESSION_NAME")
    //SELECT $QUERY_TAG
    //` }  );


    snowflake.execute({
               sqlText: `INSERT INTO LOG.TESTSESSIONLOG 
               (SESSION_NAME) 
               VALUES (?)`
               ,binds: [ qtag]
    });   

    return "SESSION_OK"; 

  $$;

1 个答案:

答案 0 :(得分:0)

编辑2019年11月4日:我在下面的回答并不完全正确,有一种方法可以在任务与其后继任务之间传递值。请参阅SYSTEM$SET_RETURN_VALUE上的文档。

即使您定义了任务之间的依赖关系,也并不意味着任务会从任务树的前任继承任何东西。

因此,如果您在一个任务中设置一个变量,则在任务完成时该变量将丢失。

这与普通会话(如GUI中的会话)不同,在正常会话中,会话状态在会话内执行的命令之间得以保留。

在任务之间,唯一相关的是前任的结束时间和后任的开始时间。

在提取查询标记时,您最好向系统询问:

function getQueryTag()
{
    var rs_QT = snowflake.execute ( { sqlText: `SHOW PARAMETERS LIKE 'QUERY_TAG'` }  );
    return rs_QT.next() && rs_QT.getColumnValue("value"); // get the QueryTag
}