Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsJe rencontre un problème avec une instruction SQL Select utilisant des noms de colonnes qui incluent des parenthèses, car les parenthèses de fin des noms de colonnes se retrouvent à côté de barres obliques inverses (en raison de l'utilisation de guillemets entre guillemets : " \!" nom de colonne [ unités ] \!" " ) et cela interfère avec les caractères d'échappement spéciaux environnants (parenthèse et barre oblique inverse : \[ ]\ ).
L'instruction SQL est écrite entre deux crochets et barres obliques ( \[ Select ... ]\ ) et j'utilise Eval(Parse(Eval Insert())) autour de l'instruction entière pour évaluer une variable (filtrage par une date de début).
La commande est structurée comme ceci :
Eval(Analyser(Eval Insérer(
"dt = Ouvrir la base de données( paramètres,
\[Sélectionnez \!"table1\!".\!"nom_colonne[unités]\!" ... ]\
);"
)));
Comme vous le voyez, le crochet de fin après column_name[units] se retrouve à côté d'une barre oblique inverse pour le guillemet autour du nom de la colonne, constituant ainsi un caractère d'échappement spécial indésirable ( ]\ ).
- J'ai essayé d'utiliser des guillemets simples autour des noms de colonnes, et la commande a été exécutée mais aucune donnée n'a été récupérée. Lorsque j'ai recherché une discussion ou une documentation sur les guillemets simples, je n'ai pas pu en trouver.
- J'ai essayé d'utiliser la chaîne de remplacement d'insertion eval pour un guillemet (à la fois " et \!" ) mais cela n'a pas réussi.
- J'ai parcouru plusieurs discussions à ce sujet, mais je n'ai pas encore trouvé de solution.
Je serais reconnaissant pour toute suggestion sur la façon dont cette situation peut être résolue, ce que je devrais essayer ou ce que je dois lire ?
Automatisation et scriptsFenêtresRé : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsTout d'abord, je vous suggère de ne pas utiliser Eval(Parse()). Je pense que vous devriez pouvoir utiliser ]" à l'intérieur des chaînes
Names Default To Here(1);
str = "\[abc]"]\";
write(str); // abc]"
Si non alors alorsComment remplacez-vous les crochets "[" "]" dans une chaîne avec Regex ? cela pourrait donner quelques idées supplémentaires.
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsJ'ai essayé de supprimer Eval(Parse()) et de simplement créer la chaîne pour commencer. Les caractères d'échappement spéciaux posent toujours problème, semble-t-il, ou c'est autre chose. Mais le problème disparaît lorsque je supprime les caractères d'échappement spéciaux ( \[ ]\ ) et il disparaît également lorsque je remplace les crochets dans le nom de la colonne par des parenthèses.
str = "\[\!"table\!".\!"colonne[unité]\!"n]\";
Merci pour votre réponse !
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsQuelle version de JMP utilisez-vous ? Je n'ai actuellement aucune base de données sur mon PC, je ne peux donc pas tester avec Open Database, mais je peux faire des tests simples en utilisant les tables JMP et 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);
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsJe travaille sur JMP 17. Je vois que le passage à une nouvelle requête SQL résout probablement ces problèmes, je pense que c'est une bonne suggestion. Je ne l'utilise pas ici car je m'appuie sur des scripts plus anciens.
S'il existe un moyen de gérer la gestion des chaînes, je suis tout ouïe pour cela, mais je pense que je vais essayer de changer de commande.
Merci!
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsSi vous échappez déjà la chaîne en utilisant "\[]\", vous n'avez pas besoin de le refaire
Names Default To Here(1);
str = "\["table"."column[unit]"n]\";
Write(str); // "table"."column[unit]"n<BR />
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsJe ne suis pas sûr de comprendre votre commentaire, mais je pense que c'est un malentendu (en tout cas merci pour la suggestion). Je n'échappe qu'en utilisant "\[]\" une fois, la deuxième fois que les symboles apparaissent, c'est à cause du nom de la colonne avec un crochet se terminant à côté d'une barre oblique inverse que je ne peux pas éviter d'utiliser.
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsOuais, cela pourrait être juste une simple confusion car je base mes commentaires sur votre script original utilisant Eval(Parse()) qui finira alors par ressembler à
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
Ré : Collision dans l'instruction SQL Select entre les caractères d'échappement spéciaux (parenthèses et barre oblique inverse) et les parenthèses dans le nom de la colonne entourées de guillemetsC'est génial de voir une meilleure structuration du code, merci !