Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MsSQL Abfrage per ParamValues aber als List (IN) (https://www.delphipraxis.net/165594-mssql-abfrage-per-paramvalues-aber-als-list.html)

norwegen60 7. Jan 2012 18:19

Datenbank: MsSQL • Version: 2008 • Zugriff über: UniDac

MsSQL Abfrage per ParamValues aber als List (IN)
 
Hallo zusammen,

ich versuche seit einiger Zeit eine Abfrage dahingehend zu optimieren, dass ich eine Liste per IN - Statement abfrage. Das SQL im Query sieht wie folgt aus:
Code:
SELECT ID, Login, Name
FROM User
WHERE (ServOrt in (:ServOrt))
Es funktioniert, wenn ich ParamValues so befülle
Delphi-Quellcode:
dbquUser_Lu.Params.ParamValues['ServOrt'] := 'F';

Verschiedene Versuche, eine Liste einzugeben, haben aber nicht funktioniert, z.B.
Delphi-Quellcode:
dbquUser_Lu.Params.ParamValues['ServOrt'] := 'F, U';
dbquUser_Lu.Params.ParamValues['ServOrt'] := VarArrayOf(['F', 'U']);
Weiß jemand wies geht?

Danke und Grüße
Gerd

s.h.a.r.k 7. Jan 2012 19:41

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Hatte das Problem auch mal, aber mit AnyDAC, wobei es keine lösung dafür gab.

Furtbichler 7. Jan 2012 20:31

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Selber basteln, anders gehts nicht.
Delphi-Quellcode:
Const
  Query = 'SELECT ID, Login, Name FROM User WHERE (ServOrt in (%s))';

Begin
  MyQuery.SQL.Text := Format(Query,[ServOrt]);
  ...

mikhal 8. Jan 2012 10:19

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Schau dir mal in der Hilfe zu den UniDAC die Verwendung von Macros an. Die kannst du zur Laufzeit setzen, ähnlich wie der vorgeschlagene Formatstring. Mit einem gravierenden Unterschied: hier wird das gesamte Argument gesetzt und das kann dann auch ein Leerstring oder NULL sein.

Ich würde wie folgt vorgehen: zunächst würde ich die Where-Klause grundsätzlich mit dem Argument 1=1 setzen. Erstens wird dann auf jeden Fall der Optimizer aufgerufen, zweitens spare ich mir den Test, ob eine Where-Klausel existiert. Die Query würde dann um das Macro &Liste erweitert:

Delphi-Quellcode:
SELECT
  ID, Login, Name
FROM
  User
WHERE
  1 = 1 
  &Liste
In der Query trägst du auf dem Reiter Macro unter &Liste einen Dummy ein:

Delphi-Quellcode:
and 1 = 1
In deinem Quelttext überschreibst du dann das Macro:

Delphi-Quellcode:
Query.MacroByName('Liste').Value := 'and ServOrt in ('F', 'U')
.


Grüße
Mikhal

norwegen60 8. Jan 2012 10:46

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Zitat:

Selber basteln, anders gehts nicht.
Danke, mit selber basteln hat's geklappt. Manchmal liegt die Lösung so nah habe ich doch jahrelang die Params nicht genutzt sondern selber gebastelt. Wenn man aber mal auf Paramas umgestellt hat, wird der Quelltext oft viel aufgeräumter, vor allem bei langen SQL`s

Zitat:

Schau dir mal in der Hilfe zu den UniDAC die Verwendung von Macros an
Die Lösung kam gerade, als ich mit dem selber basteln fertig war. Ist mir total neu und klappt auch. Was ich nicht verstanden habe ist
Zitat:

Erstens wird dann auf jeden Fall der Optimizer aufgerufen
Was meinst du damit?

mikhal 8. Jan 2012 10:58

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Zumindestens bei Oracle ist/war es so, dass der Abfrage-Optimizer der Datenbank ohne Where-Klausel nicht aufgerufen wird. Ich habe es mir daher zur Gewohnheit gemacht, immer mindestens Where 1 = 1 in der Where-Klausel einzusetzen ohne Rücksicht auf die Datenbank).

Grüße
Mikhal

norwegen60 8. Jan 2012 11:26

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
OK, Danke für die schnelle Info

s.h.a.r.k 8. Jan 2012 12:18

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Beim selbst basteln aber unbedingt auf SQL Injection aufpassen ;)

norwegen60 8. Jan 2012 15:39

AW: MsSQL Abfrage per ParamValues aber als List (IN)
 
Habe es jetzt über das Macro gelöst da das den Parametern recht nahe kommt


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