Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoHo riscontrato un problema con un'istruzione SQL Select che utilizza nomi di colonna che includono parentesi, perché le parentesi finali dei nomi di colonna finiscono accanto a barre rovesciate (a causa dell'uso di virgolette all'interno di virgolette: " \!" nome colonna [ unità ] \!" " ) e ciò interferisce con i caratteri di escape speciali circostanti (parentesi e barra rovesciata: \[ ]\ ).
L'istruzione SQL è scritta tra due parentesi quadre e barre ( \[ Select ... ]\ ) e utilizzo Eval(Parse(Eval Insert())) attorno all'intera istruzione per valutare una variabile (filtrando in base a una data di inizio).
Il comando è strutturato in questo modo:
Eval(Analizza(Eval Inserisci(
"dt = Apri database( impostazioni,
\[Seleziona \!"tabella1\!".\!"nome_colonna[unità]\!" ... ]\
);"
)));
Come puoi vedere, la parentesi graffa finale dopo column_name[units] finisce accanto a una barra rovesciata per le virgolette attorno al nome della colonna, creando di fatto un carattere di escape speciale indesiderato ( ]\ ).
- Ho provato a usare le virgolette singole attorno ai nomi delle colonne e il comando è stato eseguito ma non sono stati recuperati dati. Quando ho cercato discussioni o documentazione sulle virgolette singole non sono riuscito a trovarne.
- Ho provato a usare la stringa di sostituzione eval insert per un punto interrogativo (sia " che \!" ), ma non ci sono riuscito.
- Ho letto diverse discussioni sull'argomento, ma non sono ancora riuscito a trovare una soluzione.
Vi sarei grato se poteste darmi qualche suggerimento su come risolvere questa situazione, su cosa dovrei provare o su cosa dovrei leggere.
Automazione e scriptingFinestreRe: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoPer prima cosa ti suggerirei di non utilizzare Eval(Parse()). Penso che dovresti essere in grado di usare ]" all'interno delle stringhe
Names Default To Here(1);
str = "\[abc]"]\";
write(str); // abc]"
Se no allora alloraCome si sostituiscono le parentesi quadre "[" "]" in una stringa con Regex? Potrebbe darti qualche idea in più.
Re: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoHo provato a rimuovere Eval(Parse()) e a creare semplicemente la stringa per iniziare. I caratteri di escape speciali creano ancora un problema, a quanto pare, o è qualcos'altro. Ma il problema scompare quando rimuovo i caratteri di escape speciali ( \[ ]\ ) e scompare anche quando cambio le parentesi nel nome della colonna in parentesi tonde.
str = "\[\!"tabella\!".\!"colonna[unità]\!"n]\";
Grazie per la risposta!
Re: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoQuale versione di JMP stai utilizzando? Al momento non ho alcun database sul mio PC, quindi non posso testare utilizzando Open Database, ma posso eseguire semplici test utilizzando le tabelle JMP e 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: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoSto lavorando su JMP 17. Vedo che cambiare in New SQL Query probabilmente risolve questi problemi, penso che sia un buon suggerimento. Non lo sto usando qui perché sto costruendo su alcuni vecchi script.
Se c'è un modo per gestire la gestione delle stringhe, sono tutto orecchi per questo, ma credo che proverò a cambiare comando.
Grazie!
Re: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoSe stai già eseguendo l'escape della stringa utilizzando "\[]\" non è necessario farlo di nuovo
Names Default To Here(1);
str = "\["table"."column[unit]"n]\";
Write(str); // "table"."column[unit]"n<BR />
Re: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoNon so se ho capito il tuo commento, ma credo che ci sia un malinteso (comunque grazie per il suggerimento). Sto eseguendo l'escape usando "\[]\" solo una volta, la seconda volta che compaiono i simboli è a causa del nome della colonna con una parentesi che finisce accanto a una barra rovesciata che non posso evitare di usare.
Re: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoSì, potrebbe essere solo una semplice confusione dato che baso i miei commenti sul tuo script originale utilizzando Eval(Parse()) che finirà per apparire come
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: Collisione nell'istruzione SQL Select tra caratteri di escape speciali (parentesi e barra rovesciata) e parentesi nel nome della colonna con virgolette attornoÈ bello vedere una migliore strutturazione del codice, grazie!