Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasMe estoy encontrando con un problema con una declaración SQL Select que usa nombres de columnas que incluyen corchetes, porque los corchetes finales de los nombres de columnas terminan junto a barras invertidas (debido al uso de comillas dentro de comillas: " \!" nombre de columna [ unidades ] \!" " ) y esto interfiere con los caracteres de escape especiales circundantes (corchete y barra invertida: \[ ]\ ).
La declaración SQL está escrita entre dos corchetes y barras (\[ Select ... ]\ ) y estoy usando Eval(Parse(Eval Insert())) alrededor de toda la declaración para evaluar una variable (filtrando por una fecha de inicio).
El comando está estructurado así:
Eval(Analizar(Eval Insertar(
"dt = Abrir base de datos(configuración,
\[Seleccione \!"tabla1\!".\!"nombre_de_columna[unidades]\!" ... ]\
);"
)));
Como puede ver, el corchete final después de column_name[units] termina junto a una barra invertida para las comillas alrededor del nombre de la columna, lo que constituye efectivamente un carácter de escape especial no deseado ( ]\ ).
- He intentado usar comillas simples alrededor de los nombres de las columnas y el comando se ejecutó, pero no se recuperaron datos. Al buscar debates o documentación sobre comillas simples, no pude encontrar nada.
- Intenté usar la cadena de reemplazo de inserción eval para un signo de coma (tanto " como \!" ) pero no tuvo éxito.
- He revisado varias discusiones sobre esto pero aún no pude encontrar una solución.
Agradecería cualquier sugerencia sobre cómo se puede solucionar esta situación, qué debería intentar o qué necesito leer.
Automatización y scriptingVentanasRe: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasEn primer lugar, te sugiero que no utilices Eval(Parse()). Creo que deberías poder usar ]" dentro de las cadenas.
Names Default To Here(1);
str = "\[abc]"]\";
write(str); // abc]"
Si no, entonces, entonces¿Cómo se reemplazan los corchetes "[" "]" en una cadena con Regex? Podría brindar algunas ideas adicionales.
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasIntenté eliminar Eval(Parse()) y simplemente crear la cadena con la que comenzar. Parece que los caracteres de escape especiales siguen generando un problema, o es otra cosa. Pero el problema desaparece cuando elimino los caracteres de escape especiales ( \[ ]\ ) y también desaparece cuando cambio los corchetes en el nombre de la columna por paréntesis.
str = "\[\!"tabla\!".\!"columna[unidad]\!"n]\";
¡Gracias por tu respuesta!
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillas¿Qué versión de JMP estás usando? Actualmente no tengo ninguna base de datos en mi PC, por lo que no puedo realizar pruebas con Open Database, pero sí puedo realizar pruebas sencillas con tablas JMP y New SQL Query()
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
Column(dt1, 1) << Set Name("test[na me]");
dt = New SQL Query(
Connection("JMP"),
JMP Tables(["Big Class" => "$SAMPLE_DATA/Big Class.jmp"]),
Custom SQL("\[Select "test[na me]" from "Big Class"]\")
) << Run Foreground;
Close(dt1, No save);
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasEstoy trabajando en JMP 17. Veo que cambiar a Nueva consulta SQL probablemente resuelva estos problemas. Creo que es una buena sugerencia. No la estoy usando aquí porque estoy desarrollando algunos scripts más antiguos.
Si hay una manera de manejar la gestión de cadenas, estoy todo oídos para eso, pero creo que intentaré cambiar el comando.
¡Gracias!
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasSi ya estás escapando la cadena usando "\[]\" no necesitas hacerlo nuevamente
Names Default To Here(1);
str = "\["table"."column[unit]"n]\";
Write(str); // "table"."column[unit]"n<BR />
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasNo estoy seguro de entender tu comentario, pero creo que es un malentendido (de todos modos, gracias por la sugerencia). Solo estoy usando "\[]\" una vez, la segunda vez que aparecen los símbolos es debido al nombre de la columna con un corchete que termina al lado de una barra invertida que no puedo evitar usar.
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillasSí, puede ser simplemente una confusión simple, ya que estoy basando mis comentarios en su script original que utiliza Eval(Parse()) que luego terminará luciendo así.
Eval(Parse(Eval Insert(
"dt = Open Database( settings,
\[Select \!"table1\!".\!"column_name[units]\!" ... ]\
);"
)));
</CODE>when it maybe should look like</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
mydate = "1.1.2000";
dt = Open Database(settings,
Eval Insert("\[Select "table1"."column_name[units]"... ^mydate^]\")
);
</CODE>with some more separation</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
mydate = "1.1.2000";
sql_template = "\[Select "table1"."column_name[units]"... ¤mydate¤]\";
sql_str = Eval Insert(sql_template, "¤");
dt = Open Database(settings,
sql_str
);
https://www.jmp.com/support/help/en/18.0/index.shtml#page/jmp/jsl-syntax-rules.shtml
Re: Colisión en la sentencia SQL Select entre caracteres de escape especiales (corchete y barra invertida) y corchete en el nombre de la columna entre comillas¡Es genial ver una mejor estructuración del código, gracias!