如何将Snowflake会话参数读取到变量中?



我想将会话参数的值存储在一个变量中,这样我就可以更改它,做一些处理,然后恢复原始值。

我可以看到我想用

存储的值
show parameters like 'timezone';

但是我如何将它存储在变量中呢?

不能直接读取,但可以使用resultscan和最后一个查询id读取变量的特定值。如:

show parameters like '%timezone%';
set var=(SELECT $2 FROM table(RESULT_SCAN('<query id for show command>')) where $1='TIMEZONE');
select $var;

这里,$1='TIMEZONE'对应于我正在寻找的行,$2对应于需要存储在变量中的列值。

如果能够直接读取它们就太好了,但次之的是将它们设置在会话变量中,以便在语句中更容易引用。

我决定写一个存储过程来完成这个任务。这个SP接受两个参数,一个是您希望应用于SQL变量名的前缀(以帮助避免名称冲突),另一个是会话参数的like表达式。如果您想为所有这些变量设置变量,请为该参数发送一个空字符串或%。

create or replace procedure SESSION_PARAMETERS_TO_VARIABLES("variablePrefix" string, "likeFilter" string)
returns string
language javascript
execute as caller
as
$$
if (likeFilter == "") likeFilter = "%";
class Query{constructor(statement){this.statement = statement;}}
let show = getQuery(`show parameters like '${escapeString(likeFilter)}'`);
let params = getQuery(`select "key", "value", "type" from table(result_scan('${show.statement.getQueryId()}'))`);
let i = 0;
while (params.resultSet.next()) {
i++;
if (params.resultSet.getColumnValue("type") == 'STRING') {
getQuery(`set ${variablePrefix + params.resultSet.getColumnValue("key")} = '${escapeString(params.resultSet.getColumnValue("value"))}'`);
} else {
getQuery(`set ${variablePrefix + params.resultSet.getColumnValue("key")} = ${params.resultSet.getColumnValue("value")}`);
}
}
return `Set ${i} session variables.`;

function getQuery(sql){
cmd = {sqlText: sql};
var query = new Query(snowflake.createStatement(cmd));
query.resultSet = query.statement.execute();
return query;
}
function escapeString(value) {
var s = value.replace(/\/g, "\\");
s = s.replace(/'/g, "''" );
s = s.replace(/"/g, '\"');
s = s.replace(/s+/g, " ");
return s;
}
$$;

call session_parameters_to_variables('params_', 'timezone'); -- Set a session variable called "params_timezone" with the timezone 
call session_parameters_to_variables('', 'timezone'); -- Also can set no profix, so the session variable is the same name as the session parameter.
call session_parameters_to_variables('params_', ''); --Leave the likeFilter blank or set to % to set variables for all session parameters. This will take ~7 seconds.

最新更新