Tengo una mesa en copo de nieve y la estructura de la mesa es como la de abajo.
| Datos | identificación | marca de tiempo |
|---|---|---|
| tipo de variante | varchar | varchar |
Estoy insertando estos datos en la tabla.
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, "\\'");mi consulta de inserción es
`insertar en xyz (datos,id,marca de tiempo) seleccionar parse_json('${datos}'),'${id}','${marca de tiempo}' `
cuando estoy ejecutando la consulta está dando un error. Error de compilación SQL:\nerror de sintaxis línea 2 en la posición 378 inesperado ''\"
el registro que no tiene una comilla simple se inserta correctamente. pero el campo de datos con un valor de comillas simples está dando el error como se mencionó anteriormente. He intentado muchas cosas. Por favor recomiende.
Como no vemos todo el procedimiento, creé uno basado en su pregunta:
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(); $$ ;Como puede ver, usé ${data2} y funcionó:
call test_xyz(); select * from xyz; +----------------------------------------+----+---------------------+ | DATA | ID | TIMESTAMP | +----------------------------------------+----+---------------------+ | { "a": "hi", "b": "i'm the problem" } | id | 2022-06-29 20:30:44 | +----------------------------------------+----+---------------------+Esta función de ayuda de Javascript escapará una cadena para usar como un literal entre comillas simples en una declaración de inserción. Solo debe usarse en situaciones en las que las variables de vinculación no se pueden usar por algún motivo.
function escapeInsertString(value) { var s = value.replace(/\\/g, "\\\\"); s = s.replace(/'/g, "''" ); s = s.replace(/"/g, '\\"'); return s; }Puedes cambiar esta línea:
let data2 = data1.replace(/\'/g, "\\'");A esto:
let data2 = escapeInsertString(data1);Con la función auxiliar agregada al código SP o Node.js, esto funcionará.