Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   IN mit einem Parameter (https://www.delphipraxis.net/156125-mit-einem-parameter.html)

haentschman 20. Nov 2010 21:23

Datenbank: Firebird • Version: 2.1 • Zugriff über: Zeos (noch) .-)

IN mit einem Parameter
 
Hallo alle miteinander...:hi:

ist es möglich ein:
Code:
.... from TABLE where XXX IN (:Parameter)
als einzigen Parameter mit verschiedenen Mengen an Strings abzusetzen oder ist das eine Sackgasse ? Diverse Varianten mit QuotedStr schlugen fehl. Ich würde das ganze ungern als String zusammensetzen bzw. über mehrere Parameter da die Anzahl bei jeder Abfrage unterschiedlich ist.

Danke für Infos... Ich probiere derweil weiter :zwinker:

mkinzler 20. Nov 2010 21:28

AW: IN als Parameter
 
Geht leider nicht.

ich ersetzt in diesem Fall immer die Zeile des Staements.

SQL-Code:
select
   ...
from
   <Tabelle>
where
    Feld in
    ()
;
Delphi-Quellcode:
DataSet.SQL[6] := '(1,2)';

Bummi 20. Nov 2010 21:28

AW: IN mit einem Parameter
 
mir ist keine andere Möglichkeit bekannt als den SQL zusammenzusetzen.

haentschman 20. Nov 2010 21:36

AW: IN mit einem Parameter
 
Vielen Dank an Euch...
machmal spart gleich fragen viel Zeit :zwinker: Dann kann ich ja aufhören mich zu quälen. Dann setze ich das mal schön in einer Schleife zusammen.

Ein schönes Wochenende noch :hi:

himitsu 20. Nov 2010 21:50

AW: IN mit einem Parameter
 
Nur um es nochmal genau zu sagen:
Diese Parameter ala ":name" oder "?" usw. (jenachdem welches DBMS man nutzt) stehen für je genau einen Wert.

Also egal was man an soeinen Parameter übergibt und wie es formatiert ist, es wird immer nur als ein Wert (in deinem Fall ein String) ausgewertet.

War leider auch schon in diese "Falle" getappt und wollte genau das Gleiche versuchen. :oops:

Sir Rufo 20. Nov 2010 21:57

AW: IN mit einem Parameter
 
Trotzdem würde ich bei Parametern bleiben
Code:
Where Feld In (:InPar1, :InPar2, ...)
sonst fummelt man sich einen mit Quotes etc. zu Tode

Bummi 20. Nov 2010 22:16

AW: IN mit einem Parameter
 
@Sir Rufo
der Witz bei den IN-Parametern ist üblicherweise daß die Anzahl der Elemente variabel ist, zb der Benutzer in einer Checklistbox bestimmte Elemente ausgewählt hat.

Sir Rufo 20. Nov 2010 22:27

AW: IN mit einem Parameter
 
Zitat:

Zitat von Bummi (Beitrag 1062924)
@Sir Rufo
der Witz bei den IN-Parametern ist üblicherweise daß die Anzahl der Elemente variabel ist, zb der Benutzer in einer Checklistbox bestimmte Elemente ausgewählt hat.

ok, man scheint mich nicht zu verstehen

Delphi-Quellcode:
for idx := 1 to AnzahlParameter do
  InParamStr := InParamStr + Format( ':InParam%d', [ idx ] );
Die Kommas fehlen noch, aber der Ansatz sollte nun klar sein.
Die Werte jetzt den Parametern zuweisen und dann abschicken.

haentschman 20. Nov 2010 22:36

AW: IN mit einem Parameter
 
hmmm... ich hab jetzt zwar den String schon zusammengesetzt aber ich schau mir die Parametervariante morgen mal an. Für heute reicht es :zwinker:

Danke an alle...

Bummi 20. Nov 2010 22:46

AW: IN mit einem Parameter
 
@Sir Rufo
sorry, ich hatte Dich wirklich falsch verstanden, aber eine Schleife mit QuotedStr()+',' und an Schluß das letzte Komma wegschmeißen empfinde perönlich ich als weniger aufwändig.

himitsu 20. Nov 2010 22:56

AW: IN mit einem Parameter
 
Du hast weniger Arbeit, aber dafür mit das QuotedStr ordentlich arbeiten (korrekt die Quotes setzen), wofür zusätzliche Stringoperationen nötig sind
und dann muß das DBMS diesen String auch wieder zerlegen, was bei den Parametern nicht so aufwändig ist.

Bummi 20. Nov 2010 23:10

AW: IN mit einem Parameter
 
Danke an Sir Rufo und Himitsu für die Anregung, ich hatte zwar an dieser Ecke bisher nie Performanceprobleme werde mich aber doch mal etwas ausgiebiger damit beschäftigen.

Sir Rufo 20. Nov 2010 23:11

AW: IN mit einem Parameter
 
Und auch nur gefühlt mehr Arbeit
Delphi-Quellcode:
QryStr := '... Where Feld In (' + ParStr( 5 ) + ')';
die Funktion
Delphi-Quellcode:
ParStr( Count : integer )
liefert dir dann die entsprechenden Parameter-Felder in der gewünschten Anzahl.
Nun ist der Aufwand die Werte an die Parameter zu übergeben geringer als diese als String aufzubauen.

Bummi 20. Nov 2010 23:16

AW: IN mit einem Parameter
 
nur noch eine kleine Rückfrage, habt ihr Erfahrungen damit ob es bei einer hohen IN-Anzahl bei der Parametrisierten Form, die ja nur Sinn macht wenn man Prepared fährt z.B. bei MS-SQLserver ein Limit gibt.
Der SQL kann ja prinzipiell beliebig lang werden, die Frage wäre gibt es bei der Parameteranzahl möglicherweise eine Grenze?

Sir Rufo 20. Nov 2010 23:20

AW: IN mit einem Parameter
 
Ab einer bestimmten Parameter-Anzahl müsste man mal das Konzept überdenken.
Ansonsten bleibt immer noch die Möglichkeit die Werte in eine temp. Tabelle zu übertragen und dann wie folgt prüfen
Code:
Where Feld In ( Select tmpFeld From tmpTab )

Bummi 20. Nov 2010 23:25

AW: IN mit einem Parameter
 
SQL mäßig fühle ich mich sehr sattelfest (wegen IN TMP :-D), aber vor ich diesen Ansatz in einer stark ausgelasteten Netzwerkumgebung wähle würde ich hier die althergebrachte IN (BastelString) Lösung weiter präferieren.

LG
Thomas

Sir Rufo 20. Nov 2010 23:36

AW: IN mit einem Parameter
 
Zitat:

Zitat von Bummi (Beitrag 1062936)
nur noch eine kleine Rückfrage, habt ihr Erfahrungen damit ob es bei einer hohen IN-Anzahl bei der Parametrisierten Form, die ja nur Sinn macht wenn man Prepared fährt z.B. bei MS-SQLserver ein Limit gibt.

Meiner Meinung macht das Prepared nur dann Sinn, wenn genau diese Abfrage mehrfach benutzt wird.
Die Anzahl der Parameter ist aber variabel und somit ist es nur Zufall, wenn die Abfragen gleich sind.
Somit bringt ein Prepared überhaupt nichts, wenn es sich nicht sogar negativ auswirkt, weil vorbereitet, dann abgefragt wird und dies bei jeder Abfrage.

mkinzler 21. Nov 2010 10:18

AW: IN mit einem Parameter
 
FireBird prepared zudem automatisch


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