Snowflake cloud data platform 雪花动态SQL:相当于DBMS_SQL/sp_executesql
我正在寻找/的等价物,它允许使用绑定的参数执行动态sqlserver 背后的理由:生成要在SQL中运行并从SQL执行的代码 我知道Snowflake没有过程SQL组件,包括控制流syntaxWHILE/IF-THEN/TRY-CATCH,这样的构造可以通过存储过程中的JavaScript代码来缓解 示例场景: 生成任意SQL:here表生成Snowflake cloud data platform 雪花动态SQL:相当于DBMS_SQL/sp_executesql,snowflake-cloud-data-platform,dynamic-sql,Snowflake Cloud Data Platform,Dynamic Sql,我正在寻找/的等价物,它允许使用绑定的参数执行动态sqlserver 背后的理由:生成要在SQL中运行并从SQL执行的代码 我知道Snowflake没有过程SQL组件,包括控制流syntaxWHILE/IF-THEN/TRY-CATCH,这样的构造可以通过存储过程中的JavaScript代码来缓解 示例场景: 生成任意SQL:here表生成 SELECT create_table_sql FROM ( SELECT LISTAGG(REPLACE(CHAR(13) || ',a<ind
SELECT create_table_sql FROM (
SELECT LISTAGG(REPLACE(CHAR(13) || ',a<index> INT DEFAULT UNIFORM(1, 10000, RANDOM())', '<index>', seq8()+1),'')
WITHIN GROUP(ORDER BY seq8()) AS column_list
,REPLACE(REPLACE(
'CREATE OR REPLACE TABLE <table_name>(id INT <column_list>);'
,'<table_name>', 'wide5')
,'<column_list>', column_list) AS create_table_sql
FROM TABLE(GENERATOR(rowcount => 5))
);
现在的目标是从WebUI执行它。我的第一个想法是把它赋给变量。由于大小限制或后退,它失败:
SET sql_text = (SELECT create_table_sql FROM ...);
未完成对“SQL_TEXT”的赋值,因为该值超过了变量的大小限制。它的大小是260;限制为256个内部存储大小(字节)
这里应该是类似于executeimmediate/EXEC或其他RDBMS中已知的参数化副本
....(generated_code)
我创建了自己的过于简单的版本:
CREATE OR REPLACE PROCEDURE execute_immediate(sql_param STRING)
RETURNS VARCHAR
LANGUAGE javascript
AS
$$
var rs = snowflake.execute( { sqlText: SQL_PARAM});
return 'Done.';
$$;
并将子查询作为参数直接传递到雪花闪耀的地方:
CALL execute_immediate(subquery);
例如:
CALL execute_immediate(
SELECT create_table_sql
FROM (
SELECT LISTAGG(REPLACE(CHAR(13) || ',a<index> INT DEFAULT UNIFORM(1, 10000, RANDOM())', '<index>', seq8()+1),'')
WITHIN GROUP(ORDER BY seq8()) AS column_list
,REPLACE(REPLACE(
'CREATE OR REPLACE TABLE <table_name>(id INT <column_list>);'
,'<table_name>', 'wide5')
,'<column_list>', column_list) AS create_table_sql
FROM TABLE(GENERATOR(rowcount => 5)))
);
检查SELECT查询:创建表时从wide5中选择*
它正在发挥作用,但我相信它可以做得更好
我尝试过的其他考虑因素和备选方案并不完全令人满意:
生成SQL脚本、执行查询、复制输出、粘贴和执行它需要手动步骤
在JavaScript存储过程中编写代码生成部分是可能的,如果真的没有其他方法可用的话
动态SQL可能很难编写并且容易出错,但是参数绑定/引用标识符和限制用户输入仍然是安全的。就像在上一个查询中一样
CALL execute_immediate(
SELECT create_table_sql
FROM (
SELECT LISTAGG(REPLACE(CHAR(13) || ',a<index> INT DEFAULT UNIFORM(1, 10000, RANDOM())', '<index>', seq8()+1),'')
WITHIN GROUP(ORDER BY seq8()) AS column_list
,REPLACE(REPLACE(
'CREATE OR REPLACE TABLE <table_name>(id INT <column_list>);'
,'<table_name>', 'wide5')
,'<column_list>', column_list) AS create_table_sql
FROM TABLE(GENERATOR(rowcount => 5)))
);