![]() |
SQL Parser in Delphi
Ich müsste für SQL-Queries rauskriegen, was im Statement hinter der WHERE-Klausel steht, um
diese Inforamtionen im weiteren Verlauf zu verwenden. Ne einfache Lösung über Pos(), klappt in den meisten Fällen, aber.. ... der Tabellenname könnte z.B. BlaSülzWhere oder BlaWhereSülz oder WhereBla heißen ... ein Feldname könnte genauso aufgebaut sein ..dies kann ich von vorherein leider nicht voraussetzen. Hat einer von euch vielleicht eine Idee, wie man das geschickt lösen könnte? |
Re: SQL Parser in Delphi
Das Beispiel geht von der Annahme aus, das einem WHERE zwingend ein Leerzeichen folgt (leider kann dem WHERE ein #13#10 vorangehen):
Delphi-Quellcode:
Gruß
var
FirstPos, LastPos : Integer; UGotTheFirst, UGotTheLast, ThereAreMany : Boolean; QueryText : String; begin FirstPos := 0; LastPos := 0; FirstPos := pos('WHERE ',UPPERCASE(QueryText)); UGotTheFirst := (FirstPos > 0); LastPos := FirstPos; while pos('WHERE ',copy(UPPERCASE(QueryText),LastPos,MaxInt)) > 0 do LastPos := pos('WHERE ',copy(UPPERCASE(QueryText),LastPos,MaxInt)); UGotTheLast := (LastPos > 0); ThereAreMany := (FirstPos <> LastPos); end; |
Re: SQL Parser in Delphi
Danke dir für deinen Hilfeversuch, aber deine While-Schleife solltest du vielleicht nochmal überdenken, da Sie nicht gerade sehr schnell ist und letztendlich auch kein Ergebnis für mein Problem liefert.
danke trotzdem |
Re: SQL Parser in Delphi
Mhm. Aber Leuselator hat dir doch den richtigen Weg genannt, such einfach nach WHERE mit vorangestellten und nachgestellten Leerzeichen, statt einfach nach WHERE.
PS: Du musst auch wie Leuselator es geacmht, alles auf GROSS oder klein Buchstaben bringen, weil man ja das WHERE schreiben kann wie man will ;-) |
Re: SQL Parser in Delphi
Ein einfaches Gegenbeispiel wann es nicht klappen kann:
SELECT * FROM "Test" WHERE("ID" = '123') :( |
Re: SQL Parser in Delphi
Lass das Leerzeichen halt weg.
Wenn Du meinen Code dann noch so änderst, funktioniert er auch (ausserdem ist die Whileschleife keineswegs langsam - sie wird maximal so oft durchlaufen, wie "Where" im statement vorkommt-1, d.h. bei einem "Where" wird sie nichtmal starten)!
Delphi-Quellcode:
Gruß
var
FirstPos, LastPos : Integer; UGotTheFirst, UGotTheLast, ThereAreMany : Boolean; QueryText : String; begin FirstPos := 0; LastPos := 0; FirstPos := pos('WHERE',UPPERCASE(QueryText)); UGotTheFirst := (FirstPos > 0); LastPos := FirstPos; while pos('WHERE',copy(UPPERCASE(QueryText),LastPos+5,MaxInt)) > 0 do LastPos := LastPos+5+pos('WHERE',copy(UPPERCASE(QueryText),LastPos+5,MaxInt)); UGotTheLast := (LastPos > 0); ThereAreMany := (FirstPos <> LastPos); end; |
Re: SQL Parser in Delphi
ehm, also..
..wenn du zB. ein SQL-Staement hättest das folgendermaßen aussieht: SELECT "FromWhere" FROM "WhereAbouts" WHERE("WhereLocal" = 'Northwhere') Edit: Es könnte auch genausogut ohne anführungszeichen geschrieben worden sein -> SELECT FromWhere FROM WhereAbouts WHERE(WhereLocal = Northwhere) ..ich gebe zu ist ein Extrembeisspiel ;) und letztendlich wäre das von mir gewünschte Ergebnis 'WHERE("LocalWhere" = 'Northwhere')' ...mit deiner Möglichkeit wäre die zurückgegebene Position nicht gleich meiner Wunschmenge danke dir trotzdem für deine Mühe :) |
Re: SQL Parser in Delphi
Es schreit, es zappelt und es wird fürchterlich an den Haaren herbeigezogen :-)
Also im Ernst: Beim Schreiben von SQLStatements und erst recht bei der Benennung von Tabellen und Feldern sollte man doch wenigstens die Finger von reservierten ausdrücken lassen und ein paar Formatierungsstandards einhalten. Aber wie dem auch sei - einzige Alternative ist, wirklich einen SQL-parser zu schreiben - und das ist 'ne Menge Arbeit, nach deren Sinn man schonmal fragen dürfte. Viel Glück bei der Lösung und Gruß aus Berlin |
Re: SQL Parser in Delphi
Das Problem ist, ich kann nicht voraussetzen was für Statements abgegeben werden und muss wie der gute Murphy vom schlimmsten Fall ausgehen. :roll:
Danke noch mal vielmals für deine Mühe. Ich werde wahrscheinlich einen Freeware-Parser nutzen. Muss mal gucken, was es da alles gibt. Viele Grüße Tyrael |
Re: SQL Parser in Delphi
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz