雪花 - 带有非文字参数的 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的主要内容,如果未能解决你的问题,请参考以下文章