Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Snowflake cloud data platform 雪花动态SQL:相当于DBMS_SQL/sp_executesql_Snowflake Cloud Data Platform_Dynamic Sql - Fatal编程技术网

Snowflake cloud data platform 雪花动态SQL:相当于DBMS_SQL/sp_executesql

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

我正在寻找/的等价物,它允许使用绑定的参数执行动态sqlserver

背后的理由:生成要在SQL中运行并从SQL执行的代码

我知道Snowflake没有过程SQL组件,包括控制流syntaxWHILE/IF-THEN/TRY-CATCH,这样的构造可以通过存储过程中的JavaScript代码来缓解

示例场景:

生成任意SQL:here表生成

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)))
);