Snowflake 过程错误(将数据放入 blob 存储)

Snowflake procedure error (dropping data into blob storage)

我的程序是将数据放入 azure blob 上的 csv 文件中。 SQL 代码工作正常,但在程序中实施时出现以下错误:

JavaScript compilation error: Uncaught SyntaxError: Invalid or unexpected token in TST_30102020 at ' sqlText:'COPY INTO @storage/folder/file_1.csv' position 19

我找不到打破整个事情的奇怪符号。

程序如下:

CREATE or REPLACE PROCEDURE TST_30102020()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var stmt = snowflake.createStatement({
           sqlText:'COPY INTO @storage/folder/file_1.csv

                     FROM (SELECT t1.ATTR,t1.ATTR, t2.ATTR, t2.ATTR, t1.ATTR, t1.MIASTO, t1.ATTR, t1.ATTR,
                                    t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR,
                                    t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.KONCESJA_A, t1.ATTR, t1.ATTR
                           FROM t1

                           LEFT JOIN (SELECT * FROM table WHERE ATTR >= '2020-09-01') AS t2
                                  ON t1.ATTR= t2.ATTR AND t1.ATTR= t2.ATTR

                           LEFT JOIN (SELECT * FROM table WHERE ATTR>= '2020-09-01') AS t3
                                  ON t2.ATTR= t3.ATTR
                                  AND t2.ATTR= t3.ATTR
                                  AND t2.ATTR= t3.ATTR

                           WHERE t2.ATTR> 0
                           ORDER BY t2.ATTR, t1.ATTR)

                    FILE_FORMAT = (TYPE = 'CSV')
                    OVERWRITE = TRUE
                    SINGLE = TRUE 
                    MAX_FILE_SIZE = 170000000'});
    
try {
    stmt.execute();
    return "Succeeded.";
  }

catch (err) {
    return "Failed: " + err;
  }

$$;

问题是您用单引号打开 JavaScript 字符串,而您的字符串包含单引号。它也是一个 multi-line 文字。好消息是 JavaScript 提供了一个很好的方法来处理这个问题。将字符串上的开始和结束引号从单引号更改为反引号。反勾号位于美国键盘左上角的 tilda ~ 字符下方。

使用反引号将允许包含 SQL 语句的 multi-line 个字符串。它还允许通过在变量前添加美元符号并用花括号将其括起来来替换任何 JavaScript 变量。换句话说,如果你有一个名为 myVariable 的变量,你可以通过将 ${myVariable} 放在字符串中的任何位置来替换它,前提是你用反引号打开和关闭字符串文字。

CREATE or REPLACE PROCEDURE TST_30102020()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var stmt = snowflake.createStatement({
           sqlText:`COPY INTO @storage/folder/file_1.csv

                     FROM (SELECT t1.ATTR,t1.ATTR, t2.ATTR, t2.ATTR, t1.ATTR, t1.MIASTO, t1.ATTR, t1.ATTR,
                                    t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR,
                                    t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.ATTR, t1.KONCESJA_A, t1.ATTR, t1.ATTR
                           FROM t1

                           LEFT JOIN (SELECT * FROM table WHERE ATTR >= '2020-09-01') AS t2
                                  ON t1.ATTR= t2.ATTR AND t1.ATTR= t2.ATTR

                           LEFT JOIN (SELECT * FROM table WHERE ATTR>= '2020-09-01') AS t3
                                  ON t2.ATTR= t3.ATTR
                                  AND t2.ATTR= t3.ATTR
                                  AND t2.ATTR= t3.ATTR

                           WHERE t2.ATTR> 0
                           ORDER BY t2.ATTR, t1.ATTR)

                    FILE_FORMAT = (TYPE = 'CSV')
                    OVERWRITE = TRUE
                    SINGLE = TRUE 
                    MAX_FILE_SIZE = 170000000`});
    
try {
    stmt.execute();
    return "Succeeded.";
  }

catch (err) {
    return "Failed: " + err;
  }

$$;

最后说明...在 Whosebug 上检查代码示例的颜色编码。您会注意到您提供的那个在遇到日期时会改变颜色,因为它在那里有一个单引号字符。尽管在修改后的代码中用反引号打开和关闭报价时,它保持相同的颜色(仅对其进行更改)。