SQL Custom et Eval / Parse (et \! \! \! ...)Salut!
Je fais beaucoup de requêtes qui ne peuvent pas utiliser le générateur de requêtes JMP et qui doivent être écrites en SQL Custom.
Mais comme je veux aussi généraliser mon code, je dois intégrer beaucoup de eval / inserts et \!
Voici un exemple:
Code pas encore généralisé
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT \!"t1\!".lot_id
FROM \!"public\!".\!"v_test_run\!" \!"t1\!"
WHERE ( ( ( \!"t1\!".test_run_timestamp >= '2020-11-01 15:25:11' ) ) ) ;"
)
) << Modify;
Code généralisé pour inclure une date:
gbStr = Eval Insert("
New SQL Query(
Connection(
\!"ODBC:blabla\!"
),
QueryName( \!"v_test_run\!" ),
CustomSQL(
\!"SELECT \!\!\!"t1\!\!\!".lot_id
FROM \!\!\!"public\!\!\!".\!\!\!"v_test_run\!\!\!" \!\!\!"t1\!\!\!"
WHERE ( ( ( \!\!\!"t1\!\!\!".test_run_timestamp >= '^date_deb^' ) ) ) ;\!"
)
) << Modify;
");
Eval( Parse( gbStr ) );Y a-t-il une autre méthode qui m'éviterait d'avoir à jongler avec ces \! \! \! symboles?
Sur les scripts complexes, c'est vraiment difficile à gérer et à déboguer!
Merci
ScriptingRe: SQL Custom et Eval / Parse (et \! \! \! ...)Il existe quelques options décrites dans Cet article , Je recommande de commencer par Eval (Eval Expr ()), puis d'emballer chaque pièce que vous devez remplacer par Expr ().Cela pourrait ressembler à ceci:
Eval( Eval Expr(
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"\[SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ']\" || datevariable || "\[' ) ) ) ;]\"
)
) << Modify
) );
Re: SQL Custom et Eval / Parse (et \! \! \! ...)Merci beaucoup! J'avais lu cet article et j'avais essayé mais j'ai encore des difficultés à maîtriser cette eval (eval expr (expr))
Re: SQL Custom et Eval / Parse (et \! \! \! ...)J'utiliserais les délimiteurs \ [et] \ pour inclure des guillemets doubles dans la chaîne.
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Modify;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
Production:
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= to_date('01-Mar-2019', 'dd-mon-yyyy') ) ) ) ;"
)
) << Modify;Re: SQL Custom et Eval / Parse (et \! \! \! ...)Je conviens que cette syntaxe n'est évidente qu'une fois que vous la comprenez, et même dans ce cas, elle prête à confusion.Check-out cet article de liste de souhaits pour introduire une fonction Eval Expr First (), ce serait peut-être plus intuitif?
Re: SQL Custom et Eval / Parse (et \! \! \! ...)J'aime suivre un chemin différent en évitant les combinaisons d'analyse eval non intuitives, où je les trouve très utiles à d'autres fins.
Souvent, j'ai des requêtes complexes (construites en SQL brut par d'autres outils comme le développeur SQL). Et j'ai besoin de modifier certaines variables.
L'exemple ci-joint montre comment cela fonctionne avec une grande classe datatable, mais cela fonctionnerait pour toutes les connexions ODBC de la même manière.
Je prépare simplement ma chaîne de connexion (non utilisée ici) et la requête SQL dans une variable chaîne, donnée à l'objet "Nouvelle requête SQL".
J'utilise "assign" (au lieu de "=") car cela fonctionne bien pour les requêtes volumineuses et le pliage de code.
Et je suis plus flexible pour utiliser également la fonction de base de données ouverte ou traiter le SQL d'une autre manière.
Habituellement, les guillemets doubles ne sont pas nécessaires dans un SQL simple (et j'essaye d'éviter aussi), à moins que vous n'ayez des noms avec des espaces, etc. comme "Big Class".
Names Default To Here( 1 );
cdt = Open( "$Sample_Data\Big Class.jmp" );
age = "15";
// define custom SQL with placeholder
Assign( sql_str, "SELECT t1.name, t1.age, t1.sex, t1.height,
t1.weight
FROM \!"Big Class\!" t1
WHERE ( ( ( t1.age IN ( &age ) ) ) ) ;" );
// fill placeholder
Substitute Into( sql_str, "&age", "15" );
// execute query
dt_age = New SQL Query( Version( 130 ), Connection( "JMP" ), JMP Tables( cdt ), QueryName( "aged" || "_" || age ), CustomSQL( sql_str ) ) << Run;
Re: SQL Custom et Eval / Parse (et \! \! \! ...)Génial, c'est vraiment très utile! Et comme nous venons de créer la base de données et que j'étais l'acteur principal de cette création, je me suis juste assuré qu'aucun nom de table ou nom de variable ne comporte de parenthèses ou d'espaces, cela devrait donc simplifier cette généralisation.