首页 > 解决方案 > 即使使用 JSON.parse,Snowflake 也无法将对象绑定到查询中以将其插入到变体列中

问题描述

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

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)并收到此错误:

“位置 1 处 JSON 中的意外标记 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_VARIANTVARIANT是临时表中类型为的列。

标签: javascriptsqlobjectstored-proceduressnowflake-cloud-data-platform

解决方案


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

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;
}

推荐阅读