雪花变体数据插入问题:“专家级问题”
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