【发布时间】: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
似乎唯一的方法是使用文字生成查询,复制粘贴并运行(但这是最后的手段)。
有没有其他方法可以提供可以在运行时确定的输入?
【问题讨论】:
标签: snowflake-cloud-data-platform