雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值

Posted

技术标签:

【中文标题】雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值【英文标题】:SQL Stored procedure on snowflake is treating binded column as string and its not getting its value from the table 【发布时间】:2021-01-08 08:50:57 【问题描述】:

我正在执行一个循环遍历特定字段名称的过程,原因有两个:

    我想使用 md5 对字段名称本身进行哈希处理(我们正在使用数据保险库); 我想将每个字段名称值添加为表中的一行。

我有以下完美的程序:

CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE javascript
EXECUTE AS CALLER
AS
$$
    arr = [];
    var row_num = 1;
    // Set the indicators
    COLUMN_FIELD_NAMES = ["care_beneficiary", "cg_child_6mo_receiv_ind_iycf_nbr_1st_cons_6mc_iycfc number",
    "preg_women_rec_ind_counselling_nbr_1st_cons_pregw_iycfc",
    ...
    ];
    
    COLUMN_FIELD_NAMES_TO_HASH = [
    "cg_child_6mo_receiv_ind_iycf/nbr_1st_cons_6mc_iycfc",
    "cg_child_6mo_receiv_ind_iycf/nbr_followup_2nd_time_6mc_iycfc",
    ...
    ];
    try
//      while(rows_result.next())
          for (var col_num = 0; col_num<COLUMN_FIELD_NAMES_TO_HASH.length; col_num = col_num+1)
              var COL_NAME = COLUMN_FIELD_NAMES_TO_HASH[col_num];
              var query = "INSERT INTO LINK_OBSERVATION_FIELD SELECT (SELECT md5(concat(?, concat('CAMP', concat(CAMPNO, DATE))))), current_timestamp(), (SELECT 'ONA'), (SELECT (md5(concat(DATE, concat('CAMP', CAMPNO))))), md5(?) FROM IYCF_TEMP";
              var stmt = snowflake.createStatement( sqlText: query, binds:[COL_NAME, COL_NAME] );
              if(stmt.execute())
//                  var query = "INSERT INTO SAT_FIELD_VALUES SELECT (SELECT (md5(md5(concat(?, concat('CAMP', concat(CAMPNO, DATE))))))), current_timestamp(), NULL, (SELECT 'ONA'), ?, (SELECT 'PENDING'), (SELECT _SUBMISSION_TIME), (SELECT md5(concat(?, concat('CAMP', concat(CAMPNO, DATE))))) FROM IYCF_TEMP";
//                  var stmt = snowflake.createStatement( sqlText: query, binds: [COL_NAME, COL_NAME, COL_NAME] );
//                  stmt.execute()
              
          
//      
      return "DONE"
    
    catch(error)
        return error
    
    
$$;

第一个插入查询工作正常,成功执行后进入第二个插入查询时,出现以下错误:

无法识别数值“care_beneficiary”

我猜测错误来自以下插入查询的, ?,

INSERT INTO SAT_FIELD_VALUES SELECT (SELECT (md5(md5(concat(?, concat('CAMP', concat(CAMPNO, DATE))))))), current_timestamp(), NULL, (SELECT 'ONA'), ?, (SELECT 'PENDING'), (SELECT _SUBMISSION_TIME), (SELECT md5(concat(?, concat('CAMP', concat(CAMPNO, DATE))))) FROM IYCF_TEMP;

CONCATS 中的? 工作正常,但独立字段, ?, 。在这个独立的绑定字段中,我想从表中获取它的值而不是它的名称,我假设这是因为该字段被读取为带引号,并且查询正在考虑它不应该添加到的字符串数字字段。

知道如何删除引号或让查询将其视为字段名称而不是值吗?

【问题讨论】:

代替绑定,您可以尝试编写附加字符串和变量的查询吗? IDENTIFIER 功能对您有帮助吗? docs.snowflake.com/en/sql-reference/identifier-literal.html @felipehoffa 编写查询是什么意思? @MikeWalton 我没听懂。 IDENTIFIER() 函数告诉 Snowflake 绑定变量是一个对象,而不是文字。您可能遇到的唯一问题是它在 IDENTIFIER 内不能有超过 1 个绑定变量,因此您需要编写一个字符串,然后将其包装为 IDENTIFER() 内的绑定变量。 【参考方案1】:

Felipe 在问题的评论部分提到的解决方案是用字符串和变量绑定和组合查询:

var query = "SELECT ... " + COL_NAME + "FROM ..."

显然 IDENTIFIER(COL_NAME) 对我不起作用,但如果我知道在哪里使用绑定,我相信它会起作用。

【讨论】:

以上是关于雪花上的 SQL 存储过程将绑定列视为字符串,并且它没有从表中获取其值的主要内容,如果未能解决你的问题,请参考以下文章

雪花存储过程变量绑定错误

雪花存储过程 - 多个多行 SQL 命令

Python Glue 作业 - 雪花存储过程未返回确切的错误消息

雪花:从另一个过程调用的带有 ARRAY 参数的过程

如何将存储在雪花中的所有视图下载到本地机器

存储过程抛出“缺少列规范”