即使使用 JSON.parse,Snowflake 也无法将对象绑定到查询中以将其插入到变体列中

Posted

技术标签:

【中文标题】即使使用 JSON.parse,Snowflake 也无法将对象绑定到查询中以将其插入到变体列中【英文标题】:Snowflake unable to bind an object into a query to insert it into a variant column even when using JSON.parse 【发布时间】:2021-03-02 13:14:49 【问题描述】:

此存储过程将获取一个对象并将其插入到表的变体列中:

try 
  var table_query = "CREATE OR REPLACE TEMPORARY TABLE FIELD_NAME_TABLE (field_variant VARIANT)";
  var table_query_stmt_result = snowflake.createStatement(sqlText: table_query).execute();
  var insert_query = "INSERT INTO FIELD_NAME_TABLE SELECT ?";
  var insert_stmt = snowflake.createStatement(sqlText: insert_query, binds: [(TABLE_COL_AND_FIELDS)]);
  var result = insert_stmt.execute();
  result.next();
  return result;
  return result['number of rows inserted'];

catch(err) 
  return err.message;

TABLE_COL_AND_FIELDS 是一个具有以下结构的对象:


   "field1": "val1",
   "field2": "val2"

运行脚本时出现以下错误:

"Invalid binds argument[object Object]. Error: Unsupported type for binding argument 2undefined"

我添加了JSON.parse(TABLE_COL_AND_FIELDS) 并得到了这个错误:

“JSON 中位置 1 的意外标记 o”

我试过了:

(TABLE_COL_AND_FIELDS).toString()

我有一个错误:

"SQL compilation error:\nExpression type does not match column data type, expecting VARIANT but got VARCHAR(15) for column FIELD_VARIANT"

FIELD_VARIANT是临时表中VARIANT类型的列。

【问题讨论】:

【参考方案1】:

我通过在查询文本中添加parse_json() 并在binds 部分中添加JSON.stringify() 找到了解决方案。脚本如下:

try 
  var table_query = "CREATE OR REPLACE TEMPORARY TABLE FIELD_NAME_TABLE (field_variant VARIANT)";
  var table_query_stmt_result = snowflake.createStatement(sqlText: table_query).execute();
  var insert_query = "INSERT INTO FIELD_NAME_TABLE SELECT parse_json(?)";
  var insert_stmt = snowflake.createStatement(sqlText: insert_query, binds: [JSON.stringify(TABLE_COL_AND_FIELDS)]);
  var result = insert_stmt.execute();
  result.next();
  return result;
  return result['number of rows inserted'];

catch(err) 
  return err.message;

【讨论】:

以上是关于即使使用 JSON.parse,Snowflake 也无法将对象绑定到查询中以将其插入到变体列中的主要内容,如果未能解决你的问题,请参考以下文章

将 Snowflake ODBC 驱动程序与 MS Access 一起使用

为啥使用 JSON.parse(decodeURIComponent(staticString))?

为啥使用 JSON.parse(decodeURIComponent(staticString))?

关于vue中JSON.parse(JSON.stringify(...))使用深拷贝问题

qs.parse()qs.stringify()JSON.parse()JSON.stringify()使用方法

使用JSON.parse解析数量