Snowflake cloud data platform Snowflake-带非文字参数的系统$ABORT_会话

Snowflake cloud data platform Snowflake-带非文字参数的系统$ABORT_会话,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正在尝试运行一个(可能是中止\u事务)提供的参数不是文本: SELECT SYSTEM$ABORT_SESSION(CURRENT_SESSION()); -- NULL -- no effect, current_session() is an example, it could be read from metadata table 与变量类似(无影响): 下一种方法是使用子查询(这里更幸运,因为错误消息更具描述性): 最后一种方法是使用存储过程(由于副作用也不可能): 似乎唯一的方法是

我正在尝试运行一个(可能是
中止\u事务
)提供的参数不是文本:

SELECT SYSTEM$ABORT_SESSION(CURRENT_SESSION());
-- NULL
-- no effect, current_session() is an example, it could be read from metadata table
与变量类似(无影响):

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

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

似乎唯一的方法是使用literal、copy-paste和run生成查询(但这是最后的手段)


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

只需转换为int即可

这将返回空值:

选择系统$ABORT_SESSION(当前_SESSION());
这将按预期工作:

选择系统$ABORT\u SESSION(当前会话()::int);
截图:


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