Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage mit Parameter (https://www.delphipraxis.net/192633-sql-abfrage-mit-parameter.html)

Helmi 7. Mai 2017 12:47

Datenbank: Firebird • Version: 2.5 • Zugriff über: ZEOS

SQL-Abfrage mit Parameter
 
Hallo,

warum funktioniert die Abfrage nicht, wenn ich einen Parameter (Anzahl) benutzen möchte?

Delphi-Quellcode:
  with DataModule_DB.ZQuery do
    begin
      SQL.Clear;
      SQL.Add('WITH ROH AS(');
      SQL.Add('SELECT FIRST :Anzahl * FROM Wetterdaten ORDER BY ID DESC');
      SQL.Add(') SELECT * FROM ROH ORDER BY ID');

      ParamByName('Anzahl').AsString := LabeledAlignFormatEdit_Anzahl_Datensaetze.Text;

      Open;
    end;
so funktioniert es:
Delphi-Quellcode:
  with DataModule_DB.ZQuery do
    begin
      SQL.Clear;
      SQL.Add('WITH ROH AS(');
      SQL.Add(Format('SELECT FIRST %s * FROM Wetterdaten ORDER BY ID DESC', [LabeledAlignFormatEdit_Anzahl_Datensaetze.Text]));
      SQL.Add(') SELECT * FROM ROH ORDER BY ID');

      Open;
    end;

nahpets 7. Mai 2017 12:56

AW: SQL-Abfrage mit Parameter
 
Soweit ich weiß (und es bisher nutzen konnte) funktionieren Parameter nur in der Wherebedingung.

Ebenso funktioniert es für die Spalteninhalte bei Insert und Update, aber nicht für die Spaltennamen.

Man kann z. B. auch nicht den Tabellennamen per Parameter an ein SQL übergeben. Oder die Spaltenliste für ein order oder ein group by.

Ein
Delphi-Quellcode:
select * from tabelle where spalte1 = :wert1
funktioniert.

Ein
Delphi-Quellcode:
select * from tabelle where :spalte1 = :wert1
funktioniert nicht.

Per Parameter kann man nur Inhalte übergeben, aber nicht Teile des SQLs oder Teile der Tabellendefinitionen ...

Helmi 7. Mai 2017 13:03

AW: SQL-Abfrage mit Parameter
 
ok - Danke

Bei Insert funktioniert es nämlich bei mir, daher wollt ich es auch bei select

haentschman 7. Mai 2017 13:16

AW: SQL-Abfrage mit Parameter
 
Moin...:P
nahpets hat ja schon alles gesagt. :wink:

Deshalb habe ich nur die Meckereiabteilung zur Verfügung. :P

1. Laß das bekloppte WITH weg.
2. Die Erste SQL Zeile sollte immer SQL.Text sein. Das spart mindestens eine Zeile. :thumb: Mit dem Setzen von SQL.Text werden auch die Parameter automatisch zurückgesetzt.
3. Nichts gehen vernüftige Namen... aber LabeledAlignFormatEdit_Anzahl_Datensaetze.Text ist A: mit Unterstrichen und B: zu lang.
Benutze lieber CamelCase und für den Typ einen Präfix.
- https://de.wikipedia.org/wiki/Camelcase siehe Programmiersprachen
- Besser auch in englisch statt denglisch :zwinker:: edtDataCount.Text

Zum Thema noch eins:
Code:
SELECT * FROM (SELECT FIRST 10 * FROM WETTERDATEN ORDER BY ID DESC) ORDER BY ID
besser...später hinaus weiß du nicht mehr was das andere Statement macht. :zwinker:

Helmi 7. Mai 2017 13:22

AW: SQL-Abfrage mit Parameter
 
Zitat:

Zitat von haentschman (Beitrag 1370483)
Moin...:P
nahpets hat ja schon alles gesagt. :wink:

Deshalb habe ich nur die Meckereiabteilung zur Verfügung. :P

1. Laß das bekloppte WITH weg.
2. Die Erste SQL Zeile sollte immer SQL.Text sein. Das spart mindestens eine Zeile. :thumb: Mit dem Setzen von SQL.Text werden auch die Parameter automatisch zurückgesetzt.
3. Nichts gehen vernüftige Namen... aber LabeledAlignFormatEdit_Anzahl_Datensaetze.Text ist A: mit Unterstrichen und B: zu lang.
Benutze lieber CamelCase und für den Typ einen Präfix.
- https://de.wikipedia.org/wiki/Camelcase siehe Programmiersprachen
- Besser auch in englisch statt denglisch :zwinker:: edtDataCount.Text

Zum Thema noch eins:
Code:
SELECT * FROM (SELECT FIRST 10 * FROM WETTERDATEN ORDER BY ID DESC) ORDER BY ID
besser...später hinaus weiß du nicht mehr was das andere Statement macht. :zwinker:

Ich such immer noch einen Zusammenhang zu meiner Frage...
mag sein, dass dir manches nicht an meinem Code gefällt, mag vorkommen, aber wie gesagt: wo ist der Zusammenhang?

haentschman 7. Mai 2017 13:37

AW: SQL-Abfrage mit Parameter
 
Zitat:

nahpets hat ja schon alles gesagt.
Zitat:

Ich such immer noch einen Zusammenhang zu meiner Frage...
Auch wenn es nicht um die Parameter ging...
Dein Original Statement ist imho zu kompliziert. Du weißt in 2 Monaten nicht mehr was WITH ROH AS bedeutet. Deshalb der Alternativvorschlag.
Zitat:

dass dir manches nicht an meinem Code gefällt
Da wir hier auch Programmierneueinsteiger haben und die auch die Threads lesen, halte ich es für wichtig, das man die alten Sünden nicht noch als Copy/Paste Muster zur Verfügung stellt.

...ich bin dann mal weg. :wink:

nahpets 7. Mai 2017 13:43

AW: SQL-Abfrage mit Parameter
 
Zitat:

Zitat von Helmi
Ich such immer noch einen Zusammenhang zu meiner Frage...

Der Zusammenhang ist (vermutlich) der, dass dashier (höchstwahrscheinlich) einfacher zu lesen und zu verstehen ist:
Delphi-Quellcode:
DataModule_DB.ZQuery.Close;
DataModule_DB.ZQuery.SQL.Text := Format('select * from (select first %d * from Wetterdaten order by id desc) order by id', [IntToStr(LabeledAlignFormatEdit_Anzahl_Datensaetze.Text)]);
DataModule_DB.ZQuery.Open;
Damit sparen wir uns das Delphi- und das FireBird-SQL-With.

Das IntToStr nutze ich hier, damit es bereits im Programm "knallt", wenn in LabeledAlignFormatEdit_Anzahl_Datensaetze.Text mal keine Zahl steht und nicht erst ein (eventuell kryptischer) SQL-Fehler "hochpoppt".

Helmi 7. Mai 2017 13:49

AW: SQL-Abfrage mit Parameter
 
Zitat:

Zitat von nahpets (Beitrag 1370486)
Zitat:

Zitat von Helmi
Ich such immer noch einen Zusammenhang zu meiner Frage...

Der Zusammenhang ist (vermutlich) der, dass dashier (höchstwahrscheinlich) einfacher zu lesen und zu verstehen ist:
Delphi-Quellcode:
DataModule_DB.ZQuery.Close;
DataModule_DB.ZQuery.SQL.Text := Format('select * from (select first %d * from Wetterdaten order by id desc) order by id', [IntToStr(LabeledAlignFormatEdit_Anzahl_Datensaetze.Text)]);
DataModule_DB.ZQuery.Open;
Damit sparen wir uns das Delphi- und das FireBird-SQL-With.

Das IntToStr nutze ich hier, damit es bereits im Programm "knallt", wenn in LabeledAlignFormatEdit_Anzahl_Datensaetze.Text mal keine Zahl steht und nicht erst ein (eventuell kryptischer) SQL-Fehler "hochpoppt".

ein Freund vom Delphi-with bin ich auch nicht, daher nutz ich es auch nur sehr sehr sparsam.
Daher ist das jetzt mal eine Ausnahme, die noch überschaubar ist.

Das ich kein IntToStr nutze ist fehlerhaft meinerseits.
Da das Edit auf "Numbersonly" gesetzt ist, hab ich das mal ignoriert.
Aber wenn, dann lieber StrToIntDef um im Fehlerfall nicht unbedingt in einen Fehler zu laufen (ja - ich gib zu, damit kann man sich auch einen Fehler verschleiern)

himitsu 7. Mai 2017 15:38

AW: SQL-Abfrage mit Parameter
 
Wie wäre es mit einem Macro, anstatt einem Parameter?
Zero wird doch bestimmt sowas kennen.

Delphi-Quellcode:
  with DataModule_DB.ZQuery do
    begin
      SQL.Clear;
      SQL.Add('WITH ROH AS(');
      SQL.Add('SELECT FIRST &Anzahl * FROM Wetterdaten ORDER BY ID DESC');
      SQL.Add(') SELECT * FROM ROH ORDER BY ID');

      MacroByName('Anzahl').Value := IntToStr(LabeledAlignFormatEdit_Anzahl_Datensaetze.Text);

      Open;
    end;

jobo 7. Mai 2017 18:21

AW: SQL-Abfrage mit Parameter
 
Zur Ursprungsfrage, die Parameter sind vermutlich ausschließlich für Feldwerte gedacht.

Zum "With" im SQL Statement:
Solch ein Konstrukt macht m.E. vor allem dann Sinn, wenn die CTE im folgenden Select mehrfach wieder verendet wird, Rekursion eingesetzt wird oder sonst irgendwas, was nur mit CTE geht.
Besonders gut lesbar/erfassbar sind solche Statements dann eh meistens nicht und das ist dann der Punkt, warum man- nur für ein Order By- auch lieber drauf verzichten könnte, der Lesbarkeit halber.

Ist aber kein Verbrechen With ohne Not einzusetzen. Das einzige was (mich) am Ende interessiert: kann der Optimizer beides gleich gut oder ist aus Performancegründen / Optimizer"versagen" eine Variante vorzuziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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