如何在雪花存储过程中动态创建sql时转义单引号?

时间:2020-07-10 00:20:03

标签: dynamic-sql snowflake-cloud-data-platform

 CREATE OR REPLACE PROCEDURE DEPARTMENT_STORED_PROC(table_name VARCHAR)
    returns variant not null
    
    language javascript
    as
    $$    
    
    var sql_cmd_ingest = "copy into DEPARTMENT.CLASSES." + TABLE_NAME + "from '@DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/" + TABLE_NAME + "';";
        snowflake.execute({sqlText: sql_cmd_ingest} );
$$

以上只是一个代码段。 '@DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/"

前单引号出现错误
Execution error in store procedure DEPARTMENT_STORED_PROC: SQL compilation error: syntax error line 1 at position 70 unexpected ''@DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/CLASSES_TABLE''. At Snowflake.execute, line 11 position 10

1 个答案:

答案 0 :(得分:2)

您需要在TABLE_NAME之后和“ from”之前添加一个空格

var sql_cmd_ingest = "copy into DEPARTMENT.CLASSES." + TABLE_NAME + " from '@DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/" + TABLE_NAME + "';";

我还强烈建议在存储过程中构建SQL语句时使用JavaScript替换变量。您可以使用三种不同类型的引号在JavaScript中定义字符串,即双“单”和反勾`。

如果使用反引号开始和结束字符串,则可以在该字符串内使用任何JavaScript变量,而无需终止该字符串并以+串联。例如:

var sql_cmd_ingest = `copy into DEPARTMENT.CLASSES.${TABLE_NAME} from '@DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/${TABLE_NAME}';`;

它使SQL更具可读性,尤其是在SQL长且多行的情况下。

此外,阶段名称不应在SQL中用引号引起来。您应该删除它们:

var sql_cmd_ingest = `copy into DEPARTMENT.CLASSES.${TABLE_NAME} from 
 @DEPARTMENT.CLASSES.CLASSES_PREPROD_STAGE/${TABLE_NAME};`;