使用绑定在 Snowflake 中将数据库和架构名称作为参数传递并接收错误

Passing DB and Schema name as parameters in Snowflake using binds and receiving error

我正在使用绑定将数据库和架构名称作为参数传递到 Snowflake 存储过程中,不确定我看到的语法错误是什么。请求你的帮助。

代码:

CREATE OR REPLACE PROCEDURE repo(DB_SCHEMA VARCHAR) 
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$      
        var sql_command = ` CREATE TABLE :1.TEST_KK AS SELECT * FROM :1.DIM_ACTIVITY_HIER`;
         snowflake.execute({sqlText: sql_command, binds: [DB_SCHEMA]});

    return 'success';
    $$;
call repo('DB_DEV.DMS') 

我试过将数据库和架构名称存储在一个变量中,并绑定该变量,如下所示,但我也遇到了错误。

CREATE OR REPLACE PROCEDURE repo(DB_SCHEMA STRING) 
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$      
        var DB_SC = DB_SCHEMA;
         
         var sql_command = ` CREATE TABLE ?.TEST_KK AS SELECT * FROM ?.DIM_ACTIVITY_HIER`;
         snowflake.execute({sqlText: sql_command, binds: [DB_SC]});

         
    return DB_SC;
    $$;
call repo('DB_DEV.DMS') 

其他方式:

CREATE OR REPLACE PROCEDURE repo(DB_SCHEMA STRING) 
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$      
        var DB_SC = DB_SCHEMA;
         
         var sql_command = ` CREATE TABLE :1.TEST_KK AS SELECT * FROM :1.DIM_ACTIVITY_HIER`;
         snowflake.execute({sqlText: sql_command, binds: [DB_SC]});

         
    return DB_SC;
    $$;
call repo('DB_DEV.DMS') 

我得到如下语法错误:

对于第二个代码:存储过程 REPO 中的执行错误:

SQL compilation error: syntax error line 1 at position 14 unexpected '?'.
Syntax error line 1 at position 24 unexpected 'AS'.
Syntax error line 1 at position 41 unexpected '?'.
At Snowflake.execute, line 5 position 13

对于第三个代码:存储过程 REPO 中的执行错误:

SQL compilation error: syntax error line 1 at position 14 unexpected ':'.
Syntax error line 1 at position 25 unexpected 'AS'.
Syntax error line 1 at position 42 unexpected ':'.
At Snowflake.execute, line 5 position 13

不能对部分对象名称使用绑定变量。您可以使用 IDENTIFIER() SQL 函数将它们用于整个对象名称(三部分或使用上下文)。

如果您想使用部分名称,最简单的方法是使用 JavaScript 中的模板文字。这仅在您使用反引号打开和关闭字符串时有效,就像您在示例代码中所做的那样:

CREATE OR REPLACE PROCEDURE repo(DB_SCHEMA VARCHAR) 
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$      
        var sql_command = ` CREATE TABLE ${DB_SCHEMA}.TEST_KK AS SELECT * FROM ${DB_SCHEMA}.DIM_ACTIVITY_HIER`;
         snowflake.execute({sqlText: sql_command});

    return 'success';
    $$;
call repo('DB_DEV.DMS') 

非常感谢@Greg Pavlik。我尝试了下面的方法,它也有效。

CREATE OR REPLACE PROCEDURE repo(DB_SCHEMA STRING) 
    RETURNS string
    LANGUAGE JAVASCRIPT
    AS
    $$      
        var DB_SC = DB_SCHEMA;
         
         var sql_command ="CREATE TABLE "+ DB_SC +".TEST_KK " + "AS SELECT * FROM " + DB_SC+ ".DIM_ACTIVITY_HIER";
         snowflake.execute({sqlText: sql_command, binds: [DB_SC]});

         
    return DB_SC;
    $$;