![]() |
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:
so funktioniert es:
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;
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; |
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:
funktioniert.
select * from tabelle where spalte1 = :wert1
Ein
Delphi-Quellcode:
funktioniert nicht.
select * from tabelle where :spalte1 = :wert1
Per Parameter kann man nur Inhalte übergeben, aber nicht Teile des SQLs oder Teile der Tabellendefinitionen ... |
AW: SQL-Abfrage mit Parameter
ok - Danke
Bei Insert funktioniert es nämlich bei mir, daher wollt ich es auch bei select |
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. - ![]() - Besser auch in englisch statt denglisch :zwinker:: edtDataCount.Text Zum Thema noch eins:
Code:
besser...später hinaus weiß du nicht mehr was das andere Statement macht. :zwinker:
SELECT * FROM (SELECT FIRST 10 * FROM WETTERDATEN ORDER BY ID DESC) ORDER BY ID
|
AW: SQL-Abfrage mit Parameter
Zitat:
mag sein, dass dir manches nicht an meinem Code gefällt, mag vorkommen, aber wie gesagt: wo ist der Zusammenhang? |
AW: SQL-Abfrage mit Parameter
Zitat:
Zitat:
Dein Original Statement ist imho zu kompliziert. Du weißt in 2 Monaten nicht mehr was WITH ROH AS bedeutet. Deshalb der Alternativvorschlag. Zitat:
...ich bin dann mal weg. :wink: |
AW: SQL-Abfrage mit Parameter
Zitat:
Delphi-Quellcode:
Damit sparen wir uns das Delphi- und das FireBird-SQL-With.
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; 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". |
AW: SQL-Abfrage mit Parameter
Zitat:
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) |
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; |
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 04:16 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