雪花 - 带有非文字参数的 SYSTEM$ABORT_SESSION

Posted

技术标签:

【中文标题】雪花 - 带有非文字参数的 SYSTEM$ABORT_SESSION【英文标题】:Snowflake - SYSTEM$ABORT_SESSION with non-literal parameter 【发布时间】:2021-05-02 12:19:06 【问题描述】:

我正在尝试使用提供的非文字参数运行SYSTEM$ABORT_SESSION(可能是ABORT_TRANSACTION):

SELECT SYSTEM$ABORT_SESSION(CURRENT_SESSION());
-- NULL
-- no effect, current_session() is an example, it could be read from metadata table

与变量类似(无效):

SET session_id = CURRENT_SESSION();

SELECT $session_id;
-- 70000000000

SELECT SYSTEM$ABORT_SESSION($session_id);
-- NULL

下一个方法是使用子查询(这里更幸运,因为错误消息更具描述性):

SELECT SYSTEM$ABORT_SESSION(s.session_id)
FROM (SELECT CURRENT_SESSION()) AS s(session_id);
-- non-constant input

SELECT SYSTEM$ABORT_SESSION(s.session_id)
FROM (SELECT $session_id) AS s(session_id);
-- non-constant input

最后的方法是使用存储过程(由于副作用也不可能):

CREATE OR REPLACE PROCEDURE abort_session(session_id FLOAT)
RETURNS varchar
LANGUAGE javascript
AS
$$
    // same effect regardless of SQL concatenation/parameter binding
    sql = 'SELECT SYSTEM$ABORT_SESSION(' + SESSION_ID + ')';
    var rs = snowflake.execute( sqlText: sql);

    return 'Done';
$$;

CALL abort_session(CURRENT_SESSION());
-- Execution error in store procedure ABORT_SESSION:
-- SQL compilation error: Query called from a stored procedure contains a function with side effects
-- [SYSTEM$ABORT_SESSION]. At Snowflake.execute, line 3 position 23

似乎唯一的方法是使用文字生成查询,复制粘贴并运行(但这是最后的手段)。

有没有其他方法可以提供可以在运行时确定的输入?

【问题讨论】:

【参考方案1】:

只需转换为 int 即可。

这将返回 null:

SELECT SYSTEM$ABORT_SESSION(CURRENT_SESSION());

这按预期工作:

SELECT SYSTEM$ABORT_SESSION(CURRENT_SESSION()::int);

截图:

【讨论】:

这很令人惊讶,但很好,它很容易解决。顺便说一句,ABORT_SESSION 参数的数据类型是什么?函数调用期间不应该有隐式转换吗? 我同意这是令人惊讶的行为 - 我不确定实现方式,但我通过使用您精心布置的示例来实现。 我还看到您通过新 UI 获得了不错的输出。会话中止时使用经典 UI,您将立即退出 :)

以上是关于雪花 - 带有非文字参数的 SYSTEM$ABORT_SESSION的主要内容,如果未能解决你的问题,请参考以下文章

带有输入变量的雪花存储过程

BarTender是怎么做出雪花状文字

九度 题目1421:Abor

2023跨年代码(烟花+自定义文字+背景音乐+雪花+倒计时)

圣诞节的python豪华版圣诞树,包括雪花彩灯文字背景

字符串文字不允许作为非类型模板参数