Stored procedures 雪花、任务和会话变量问题

Stored procedures 雪花、任务和会话变量问题,stored-procedures,task,session-variables,snowflake-cloud-data-platform,Stored Procedures,Task,Session Variables,Snowflake Cloud Data Platform,我在Snowflake中遇到了一个问题,即执行存储过程的任务以及SP正在使用一个会话变量QUERY_标记,我想将该标记用于日志记录目的。 当任务执行SP时,我将得到以下错误: “会话变量“$QUERY\u TAG”不存在” 调用方在那里时执行 我尝试在哪里设置QUERY_标记并不重要(在第一个任务预编码代码中或在定义中) 任务和SP由我作为系统管理员创建 在查询编辑器(Snowflake、DBeaver等)中执行SP时,它运行良好,因此SP中没有编码错误。 SET QUERY_TAG='A ni

我在Snowflake中遇到了一个问题,即执行存储过程的任务以及SP正在使用一个会话变量QUERY_标记,我想将该标记用于日志记录目的。 当任务执行SP时,我将得到以下错误: “会话变量“$QUERY\u TAG”不存在” 调用方在那里时执行 我尝试在哪里设置QUERY_标记并不重要(在第一个任务预编码代码中或在定义中)

任务和SP由我作为系统管理员创建

在查询编辑器(Snowflake、DBeaver等)中执行SP时,它运行良好,因此SP中没有编码错误。 SET QUERY_TAG='A nice QUERY TAG' 调用TASK_SCHEMA.SP_TASK_ONE()

当我在工作表或DBeaver或类似工具中调用doing时,它运行良好。 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"; 

  $$;

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

即使定义了任务之间的依赖关系,也不意味着任务继承了任务树中前置任务的任何内容

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

这与普通会话(如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
} 

如果我在第一个任务中设置QUERY_标记并从那里调用过程,会有什么不同吗?SP是否在“任务会话”中运行并有权访问$QUERY_标记,或者SP是否在其自己的会话中独立于任务执行?创建或替换任务TASK\u SCHEMA.TASK\u ONE\u precd WAREHOUSE=TASK\u WH SCHEDULE='2分钟'QUERY\u TAG='My QUERY TAG',调用TASK\u SCHEMA.SP\u TASK\u ONE(),这将产生所有不同。有关如何提取QUERY_标记会话参数,请参阅上面的my函数。。。应该不需要SQL变量$QUERY_标记……我不知道哪个变量可以让您将任务结果传递给后续任务。