Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SQLCmd Manipulation (https://www.delphipraxis.net/175942-sqlcmd-manipulation.html)

Gruber_Hans_12345 31. Jul 2013 09:47

SQLCmd Manipulation
 
Hallo ich suche eine library oder co, mit der ich einfach und leicht SQL commands bearbeiten kann.

Im aktuellen Fall habe ich eine SQL Command und muss dort neue WHERE Klauseln dynamisch hinzufügen ... aber das ist ledier gar nicht so leicht ;)

Code:
SELECT A.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = A.X)
, A.TEST
FROM TABA A
WHERE A.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = A.Y) AND A.DELETED = 0
UNION
SELECT D.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = D.X)
, D.TEST
FROM TABD D
WHERE D.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = D.Y) AND D.DELETED = 0
nun will dynamisch eine neue WHERE Klausel einfügen in diesem Fall 2 mal in jedem Union zweig

Code:
SELECT A.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = A.X)
, A.TEST
FROM TABA A
WHERE (---NEUE WHERE ---) AND (A.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = A.Y) AND A.DELETED = 0)
UNION
SELECT D.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = D.X)
, D.TEST
FROM TABD D
WHERE (---NEUE WHERE ---) AND (D.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = D.Y) AND D.DELETED = 0)
kennt wer eine Library für soetwas?

Perlsau 31. Jul 2013 10:03

AW: SQLCmd Manipulation
 
Suchst du vielleicht einen SQL-Parser?

Gruber_Hans_12345 31. Jul 2013 10:05

AW: SQLCmd Manipulation
 
ja sowas ähnliches nur halt was auch gleich eine Manipulation ermöglicht ...

Sir Rufo 31. Jul 2013 10:06

AW: SQLCmd Manipulation
 
Ganz simpel und einfach?

Delphi-Referenz durchsuchenStringReplace ;)

SQL-Code:
SELECT A.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = A.X)
, A.TEST
FROM TABA A
WHERE (%WHEREADD%) AND (A.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = A.Y) AND A.DELETED = 0)
UNION
SELECT D.ID, (SELECT FIRST 1 B.ID FROM TABB B WHERE B.X = D.X)
, D.TEST
FROM TABD D
WHERE (%WHEREADD%) AND (D.ID IN (SELECT C.ID FROM TABC C WHERE C.Y = D.Y) AND D.DELETED = 0)
Delphi-Quellcode:
function ModifyWhereAdd(const SqlCmd, WhereAdd : string) : string;
var
  LReplacePattern : string;
begin
  if ( WhereAdd = '' ) then
    LReplacePattern := '1=1'
  else
    LReplacePattern := WhereAdd;

  Result := StringReplace( SqlCmd, '(%WHEREADD%)', '( ' + LReplacePattern + ' )', [ rfReplaceAll, rfIgnoreCase ] );
end;

Gruber_Hans_12345 31. Jul 2013 10:26

AW: SQLCmd Manipulation
 
jein

es kann sein das ich zufällig gar keinen Filter hinzufügen will, oder das es aber 4 filter werden die dynamisch hinzugefügt werden sollen, dann versagt das einfache simple StringReplace

Und das größte Problem ist, das ich diese SQL Commands nicht so umändern kann, da die aus einem bestehenden System kommen ...

Sir Rufo 31. Jul 2013 10:46

AW: SQLCmd Manipulation
 
Wieso sollte das versagen?

Wenn kein Filter, dann mit "(1=1)" ersetzen.

Wenn du dynamisch mehrere Bedingungen haben möchtest, dann definiere dir eine Klasse, die diese Bedingungen entgegennehmen kann und dann für die Ersetzung zusammenbaut und per StringReplace dort einsetzt.

Gruber_Hans_12345 31. Jul 2013 10:59

AW: SQLCmd Manipulation
 
Zitat:

Zitat von Sir Rufo (Beitrag 1223105)
Wieso sollte das versagen?

Wenn kein Filter, dann mit "(1=1)" ersetzen.

Wenn du dynamisch mehrere Bedingungen haben möchtest, dann definiere dir eine Klasse, die diese Bedingungen entgegennehmen kann und dann für die Ersetzung zusammenbaut und per StringReplace dort einsetzt.


mein Hauptproblem ist aber das ich dieses (%WHEREADD%) wiederum dynamisch in die SQL Commands reinbringen müsste, da ich ja bestehende SQL Command bekomme die ich verarbeiten muss ... und dann bin ich ja wieder im selben dilemma ....

Sir Rufo 31. Jul 2013 11:38

AW: SQLCmd Manipulation
 
Ok, aber von der Beschreibung her macht dieser

http://sourceforge.net/projects/gasqlparser/

doch einen guten Eindruck

jobo 31. Jul 2013 11:42

AW: SQLCmd Manipulation
 
Also ohne Parser oder die Verwendung von Pattern im Basis SQL hast Du da schlechte Karten.

Vielleicht hab ich das falsch im Kopf, aber irgendjemand hat hier neulich nach Aufbau von Union Views gefragt, warst Du das?
Annahme:
So oder so, es ist der Erste Union View im Projekt, sonst würdest Du hier nicht mit der Frage aufschlagen.

Vorschlag:
Baue das Union SQL in einen View ein. Alle minimalen Where Bedinungen von Anfang an aufnehmen, alle Felder, die ggF. gefiltert werden mit ins SQL Select rein.

Im Ergebnis hast Du wieder nur eine Where Clause.
Haken an der Sache dürfte ggF. die Performance sein, da alle möglichen Felder für Where Kriterien mit geschleift werden müssen und natürlich immer über alles "gefiltert" wird.

p80286 31. Jul 2013 15:39

AW: SQLCmd Manipulation
 
Ich kann Deine Einwände nicht so ganz nach vollziehen.
Du hast einen AbfrageText vorgegeben
Code:
Select irgendwas
from irgendwo
where irgendeinebedingung
Daraus machs Du
Code:
Select irgendwas
from irgendwo
where 1=1
  and irgendeinebedingung
  and irgendwasneues
and irgendwasneues wir durch Deine zusätzlichen Bedingungen ersetzt

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz