0

我在 Snowflake 中有一个要求,我必须生成一些 SQL,然后执行它来创建一个新表。

我已经通过创建 UDF 成功生成了 create table 语句(目前是硬编码的)

CREATE OR REPLACE FUNCTION COOL_CARGO.test()
  RETURNS STRING 
  AS 
  $$
  SELECT substr(regexp_replace(GET_DDL('TABLE', 'COOL_CARGO.DIM_BRANCH'),('DIM_BRANCH'),'COOL_CARGO.DIM_BRANCH_ERR'), 0, LENGTH(regexp_replace(GET_DDL('TABLE', 'COOL_CARGO.DIM_BRANCH'),('DIM_BRANCH'),'COOL_CARGO.DIM_BRANCH_ERR')) -2)||','||'  etl_err_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  etl_id_run int DEFAULT NULL,
  etl_err_noe int DEFAULT NULL,
  etl_err_desc varchar(512) DEFAULT NULL,
  etl_err_col varchar(256) DEFAULT NULL,
  etl_err_cod varchar(256) DEFAULT NULL'||');'
 $$
 ;

这将输出以下内容

create or replace TABLE COOL_CARGO.DIM_BRANCH_ERR (
    TK_BRANCH NUMBER(38,0),
    GB_BRANCH_CODE VARCHAR(256),
    GB_BRANCH_NAME VARCHAR(256),
    GB_BRANCH_CITY VARCHAR(256),
    GB_BRANCH_STATE VARCHAR(256),
    BG_BRANCH_HOME_PORT VARCHAR(256),
    BG_BRANCH_COUNTRY_CODE VARCHAR(256),
    BG_BRANCH_COUNTRY_NAME VARCHAR(256)
,  etl_err_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  etl_id_run int DEFAULT NULL,
  etl_err_noe int DEFAULT NULL,
  etl_err_desc varchar(512) DEFAULT NULL,
  etl_err_col varchar(256) DEFAULT NULL,
  etl_err_cod varchar(256) DEFAULT NULL);

我现在需要创建一个 UDF 来执行这个 create table 语句,但由于它似乎只返回字符串之类的东西,我无法通过例如从另一个函数调用它来执行它。

CREATE OR REPLACE FUNCTION COOL_CARGO.run_test()
     RETURNS string
     AS
     $$
     COOL_CARGO.test()
      $$
     ;

然后我尝试运行该函数来创建表

select COOL_CARGO.run_test();

我不知道我想要的是否可以完成,如果不可能,我会很生气......

这可以在雪花数据库中完成吗?

4

1 回答 1

0

您可以使用 Snowflake于2019 年推出的新存储过程功能来实现这一点。它允许您构建任意 SQL 字符串并在 SQL 或 JavaScript 中执行。

您现有的方法可以很容易地适应存储过程(下面的示例是说明性的,尚未经过专门测试):

create or replace procedure test()
  returns null
  language javascript
  as
  $$
  var orig_ddl_qry = "SELECT GET_DDL('TABLE', 'COOL_CARGO.DIM_BRANCH')";
  var get_ddl_stmt = snowflake.createStatement(
         {
         sqlText: orig_ddl_qry
         }
      );
  var get_ddl_res = get_ddl_stmt.execute();
  get_ddl_res.next();
  var orig_ddl_str = res.getColumnValue(1);
  var replaced_ddl_open = orig_ddl_str.replace("DIM_BRANCH", "COOL_CARGO.DIM_BRANCH_ERR").slice(0, -1);
  var new_ddl = replaced_ddl_open + ", etl_err_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, etl_id_run int DEFAULT NULL, etl_err_noe int DEFAULT NULL, etl_err_desc varchar(512) DEFAULT NULL, etl_err_col varchar(256) DEFAULT NULL, etl_err_cod varchar(256) DEFAULT NULL);";
  var create_stmt = snowflake.createStatement(
         {
         sqlText: new_ddl
         }
      );
  var create_ddl_res = create_stmt.execute();
  $$
  ;

CALL test();
于 2020-01-16T05:03:59.110 回答