开发者问题收集

雪花变体数据插入问题:“专家级问题”

2022-06-30
302

我在 Snowflake 中有一个表,表的结构如下所示。

数据 id 时间戳
变量类型 varchar varchar

我正在将这些数据插入表中

        let data = {
        "a":"hi",
        "b":"i'm the problem"
        }
    let id = "id";
    let timestamp = "2022-06-29 20:30:44"
let data1 = JSON.stringify(data);
let data2 = data1.replace(/\'/g, "\\'");

我的插入查询是

` 插入 xyz (Data,id,timestamp) select parse_json('${data}'),'${id}','${timestamp}' `

当我运行查询时,它给出了一个错误。 SQL 编译错误:\nsyntax error line 2 at position 378 accidental ''\"

没有单引号的记录插入正确。但带有单引号值的数据字段给出了如上所述的错误。我尝试了很多方法。 请提出建议。

2个回答

此 Javascript 辅助函数将转义字符串,以用作插入语句中的单引号文字。它只应用于由于某种原因无法使用绑定变量的情况。

function escapeInsertString(value) {
    var s = value.replace(/\\/g, "\\\\");
    s = s.replace(/'/g, "''" );
    s = s.replace(/"/g, '\\"');
    return s;
}

您可以将此行:

let data2 = data1.replace(/\'/g, "\\'");

更改为:

let data2 = escapeInsertString(data1);

将辅助函数添加到 SP 或 Node.js 代码后,此操作即可奏效。

Greg Pavlik
2022-06-30

由于我们看不到整个过程,我根据您的问题创建了一个过程:

create or replace table xyz (data variant, id varchar, timestamp varchar );

create or replace procedure test_xyz()
returns varchar
LANGUAGE JAVASCRIPT
as
$$
    let data = {
        "a":"hi",
        "b":"i'm the problem"    }
    let id = "id";
    let timestamp = "2022-06-29 20:30:44"
    let data1 = JSON.stringify(data);
    let data2 = data1.replace(/\'/g, "\\'");


    snowflake.createStatement( { sqlText: ` insert into xyz (Data,id,timestamp) select parse_json('${data2}'),'${id}','${timestamp}' ` } ).execute();
 
$$ ;

如您所见,我使用了 ${data2},并且它起作用了:

call test_xyz();

select * from xyz;

+----------------------------------------+----+---------------------+
|                  DATA                  | ID |      TIMESTAMP      |
+----------------------------------------+----+---------------------+
| { "a": "hi", "b": "i'm the problem"  } | id | 2022-06-29 20:30:44 |
+----------------------------------------+----+---------------------+
Gokhan Atil
2022-06-30