SQL Prepared Parameter FireDac mit "in" -Klausel

8

Ich kämpfe mit dem In-Operator mit FireDac.

Ich verwende eine Oracle-Datenbank und kann keine einfache Abfrage ausführen.

%Vor%

Es funktioniert mit einem Parameter, aber das ist offensichtlich nicht der Zweck des in-Operators.

Mehrere Werte funktionieren jedoch nicht:

%Vor%

Könnte es sein, dass der in-Operator nicht unterstützt wird? Und wenn ja, womit würde es ersetzt werden?

    
Tommy 26.10.2015, 12:24
quelle

3 Antworten

2

Wenn Sie nach MS Sql Server oder einem Back-End mit ähnlicher Unterstützung für "IN" fragen, können Sie keine Reihe von Werten als einzelnen Parameter für eine IN-Klausel einer Abfrage angeben. Jedoch ist eine allgemeine (nicht FireDAC-spezifische) Möglichkeit, dies zu tun, ohne Ad-hoc-Sql (das das Risiko der Sql-Injektion trägt, wenn Sie vorsichtig sind)

  • Verwenden Sie eine Reihe von Einfügungen (oder .InsertRecords in TDataSet ), um die "IN" -Werte in eine einspaltige temporäre Tabelle einzufügen. Dies hat den Vorteil, dass Sie durch Ihre Parametrierung nicht auf eine bestimmte Anzahl von Werten in der IN-Liste beschränkt sind.

  • Führen Sie dann "Select * from MyTable" aus, wo SomeColumn in (Wählen Sie ColumnValue von #MyTempTable)

  • aus

Es ist ein bisschen Leistung verglichen mit der Angabe der IN-Listenwerte in Ad-hoc-Sq, natürlich, aber nicht viel, wie aus dem folgenden Beispiel ersichtlich ist. Wenn Sie TDFQuery s verwenden, erfordert die Erstellung der INList-Tabelle zwei Schritte, einen, um sie zu definieren, und den anderen, um eine Auswahl * daraus zu machen. Wenn Sie stattdessen TAdoQuery s verwenden, können diese beiden Schritte kombiniert werden.

%Vor%

Beachten Sie, dass diese Implementierung keine parametrisierten oder Ad-hoc-Sql-Abfragen benötigt.

    
MartynA 26.10.2015, 21:48
quelle
3

Ich habe gerade dieses Themas auf den Embarcadero Foren, in denen Benutzer Serge Girard gepostet Lösung:

verwenden Sie stattdessen Makro und vielleicht auf eine etwas andere Art und Weise

%Vor%

oder

%Vor%     
Tommy 11.02.2016 06:21
quelle
0

Wenn Sie immer noch einen Parameter für eine Liste verwenden möchten, funktioniert dies für SQL Server:

%Vor%

Der Wert für den Parameter sollte eine beliebige Anzahl von Werten sein, die durch ein Zeichen getrennt sind, von dem Sie wissen, dass es nicht im Feld ist (z. B. eine Pipe): |

Wenn Sie "M | F" übergeben, werden alle M und F zurückgeliefert.

Sie können dies auch in Oracle tun, indem Sie anstelle von charindex die Funktion instr verwenden.

Ich hoffe, das hilft.

    
MJunges 15.04.2016 06:34
quelle

Tags und Links