AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Abfrage mit Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage mit Parameter

Ein Thema von Helmi · begonnen am 7. Mai 2017 · letzter Beitrag vom 7. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#1

SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 13:47
Datenbank: Firebird • Version: 2.5 • Zugriff über: ZEOS
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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 13:56
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 select * from tabelle where spalte1 = :wert1 funktioniert.

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

Per Parameter kann man nur Inhalte übergeben, aber nicht Teile des SQLs oder Teile der Tabellendefinitionen ...
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#3

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:03
ok - Danke

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

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:16
Moin...
nahpets hat ja schon alles gesagt.

Deshalb habe ich nur die Meckereiabteilung zur Verfügung.

1. Laß das bekloppte WITH weg.
2. Die Erste SQL Zeile sollte immer SQL.Text sein. Das spart mindestens eine Zeile. 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 : 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.

Geändert von haentschman ( 7. Mai 2017 um 14:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#5

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:22
Moin...
nahpets hat ja schon alles gesagt.

Deshalb habe ich nur die Meckereiabteilung zur Verfügung.

1. Laß das bekloppte WITH weg.
2. Die Erste SQL Zeile sollte immer SQL.Text sein. Das spart mindestens eine Zeile. 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 : 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.
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:37
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.

Geändert von haentschman ( 7. Mai 2017 um 14:40 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:43
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".
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#8

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 14:49
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)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 16:38
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;
$2B or not $2B
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: SQL-Abfrage mit Parameter

  Alt 7. Mai 2017, 19:21
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.
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