![]() |
Datenbank: FB • Version: 2 • Zugriff über: egal
FB: Prepared Query mit In-Statement ?
Hallo,
ich habe eine Query, die wird 100mal ausgeführt. Select Feld3 From Tab Where (Feld1=:Feld1) And (Feld2 In :Feld2) Feld1 ist Integer Feld2 ein String oder String-Liste Leider kann ich die Query nicht preparen wegen dem In. Geht das irgendwie anders ?? |
AW: FB: Prepared Query mit In-Statement ?
Was steht den in dem Parameter Feld2?
|
AW: FB: Prepared Query mit In-Statement ?
Warum geht das nicht?
Fehlermeldung? Quelltext mit Parameterbefüllung und konkreten Beispieldaten? |
AW: FB: Prepared Query mit In-Statement ?
IN unterstützt keine Parameter.
|
AW: FB: Prepared Query mit In-Statement ?
Jain, so absolut stimmt das nicht.
Je Parameter darf nur ein Wert übergeben werden. Dashier funktioniert:
Delphi-Quellcode:
Dashier funktioniert ebenfalls:
qry.Close;
qry.SQL.Clear; qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 '); qry.SQL.Add('and feld2 in (:feld2) '); qry.Prepare; qry.Params[0].AsInteger := 1; qry.Params[1].AsString := '''Feldinhalt'''; qry.Open; ShowMessage(Format('%d',[qry.RecordCount])); qry.Close;
Delphi-Quellcode:
Dashier funktioniert jedoch nicht:
qry.Close;
qry.SQL.Clear; qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 '); qry.SQL.Add('and feld2 in (:feld2a,:feld2b,:feld2c) '); qry.Prepare; qry.Params[0].AsInteger := 1; qry.Params[1].AsString := '''FeldinhaltA'''; qry.Params[2].AsString := '''FeldinhaltB'''; qry.Params[3].AsString := '''FeldinhaltC'''; qry.Open; ShowMessage(Format('%d',[qry.RecordCount])); qry.Close;
Delphi-Quellcode:
qry.Close;
qry.SQL.Clear; qry.SQL.Add('select feld3 from tabelle where feld1 = :feld1 '); qry.SQL.Add('and feld2 in (:feld2) '); qry.Prepare; qry.Params[0].AsInteger := 1; qry.Params[1].AsString := '''FeldinhaltA'',''FeldinhaltB'',''FeldinhaltC'''; qry.Open; ShowMessage(Format('%d',[qry.RecordCount])); qry.Close; |
AW: FB: Prepared Query mit In-Statement ?
Hallo,
Fehlermeldung beim Prepare "Token ? unknown" Feld2 ist eine variable Anzahl von Strings. Ich habe hier IBExpert und IBDAC. Das das Prepare nicht geht, ist ja bekannt, wie könnte man das denn lösen? Ich möchte ungern X prepared Queries (pro Anzahl der Strings eine) bauen, sehe das aber als einzige Lösung. |
AW: FB: Prepared Query mit In-Statement ?
Token unknown lässt auf einen Syntaxfehler im SQL schließen, vermutlich ist das aber nur eine Teilmenge der Fehlermeldung.
Bitte mal das vollständige SQL und die vollständige Fehlermeldung. So ist das nur was für die :glaskugel: Ein Parameter = ein Wert. Wenn ein Wert aus mehreren Zeichenfolgen besteht, geht das. Wenn ein Parameter aber mehrere einzelne Werte enthält, die eigentlich separat ins IN sollen, dann geht das nicht.
Delphi-Quellcode:
funktioniert.
qry.SQL.Text := 'select * from x where feld2 IN (:Parameter)';
qry.Params[0].AsString := 'Das ist jetzt mal etwas Text.'; Das wird zu
SQL-Code:
, wobei hier das IN auch durch ein = ersetzt werden könnte.
select * from x where feld2 IN ('Das ist jetzt mal etwas Text.')
Delphi-Quellcode:
funktioniert, kann aber zu einem deutlich anderen Ergebnis, als die vorherige Variante, führen.
qry.SQL.Text := 'select * from x where feld2 IN (:P1,:P2,:P3,:P4,:P5,:P6)';
qry.Params[0].AsString := 'Das' qry.Params[1].AsString := 'ist' qry.Params[2].AsString := 'jetzt' qry.Params[3].AsString := 'mal' qry.Params[4].AsString := 'etwas' qry.Params[5].AsString := 'Text.'
Delphi-Quellcode:
funktioniert eventuell technisch. Im IN steht aber nur ein Wert, nach dem gesucht werden soll, und nicht sechs Werte, wie der Aufbau des Parameters suggerieren könnte. Und wenn hier die Anzahl der ' nicht so ganz passt, könnte die daraus resultierende Fehlermeldung auch 'Token unknown' enthalten.
qry.SQL.Text := 'select * from x where feld2 IN (:Parameter)';
qry.Params[0].AsString := '''Das'',''ist'',''jetzt'',''mal'',''etwas'',''Text.'''; |
AW: FB: Prepared Query mit In-Statement ?
Das IN ist ja faktisch nur eine Kurzform für mehrere OR-verknüpfte Werte. Und mehrere Werte bekommt man eben nicht dynamisch parametrisiert. Klingt blöd, is aber so.
|
AW: FB: Prepared Query mit In-Statement ?
Hallo,
der Fehler kommt bereits beim Prepare, hat also nichts mit der Anzahl der Strings im Parameter zu tun. FB macht das schon richtig so, dass es sagt, IN kann nicht prepared werden. Token unknown lässt auf einen Syntaxfehler im SQL schließen, vermutlich ist das aber nur eine Teilmenge der Fehlermeldung. Nein, ohne das IN funktioniert es. |
AW: FB: Prepared Query mit In-Statement ?
Zitat:
SQL-Code:
Die Klammern dürfen nicht Teil des Parameterinhaltes sein. Ist dem so, so ist "Token unknown" ein Teil der Fehlermeldung.
Select Feld3 From Tab
Where (Feld1=:Feld1) And (Feld2 In (:Feld2)) Vollständig dürfte sie in etwa Zitat:
Zitat:
Um Die Syntax für das Prepare zu prüfen, gehe ich zum Testen immer her und mache um die Parameter Hochkommata. Also
SQL-Code:
bei Deinem Statement. Das wird auch scheitern, da es ein ungültiges SQL ist. Die Klammern beim IN fehlen!!!
Select Feld3 From Tab
Where (Feld1=':Feld1') And (Feld2 In ':Feld2') Parameter können nur Werte enthalten, aber nicht Teile des SQLs. Die Klammern sind aber Teile des SQLs.
SQL-Code:
Select Feld3 From Tab
Where (Feld1=:Feld1) And (Feld2 :Feld2)
Delphi-Quellcode:
geht ja auch nicht oder gar
qry.params[0] := 'in (1,2,3)';
SQL-Code:
Select Feld3 From Tab
Where (Feld1=:Feld1) And (:Feld2)
Delphi-Quellcode:
geht auch nicht.
qry.params[0] := 'feld2 in (1,2,3)';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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 by Thomas Breitkreuz