AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MsSQL Abfrage per ParamValues aber als List (IN)

MsSQL Abfrage per ParamValues aber als List (IN)

Ein Thema von norwegen60 · begonnen am 7. Jan 2012 · letzter Beitrag vom 8. Jan 2012
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
437 Beiträge
 
Delphi 10.3 Rio
 
#1

MsSQL Abfrage per ParamValues aber als List (IN)

  Alt 7. Jan 2012, 17:19
Datenbank: MsSQL • Version: 2008 • Zugriff über: UniDac
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
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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

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

  Alt 7. Jan 2012, 18:41
Hatte das Problem auch mal, aber mit AnyDAC, wobei es keine lösung dafür gab.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#3

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

  Alt 7. Jan 2012, 19:31
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]);
  ...
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
787 Beiträge
 
Delphi 10.3 Rio
 
#4

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

  Alt 8. Jan 2012, 09:19
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:

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

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


Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
437 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 8. Jan 2012, 09:46
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?
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
787 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 8. Jan 2012, 09:58
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
437 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 8. Jan 2012, 10:26
OK, Danke für die schnelle Info
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

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

  Alt 8. Jan 2012, 11:18
Beim selbst basteln aber unbedingt auf SQL Injection aufpassen
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
437 Beiträge
 
Delphi 10.3 Rio
 
#9

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

  Alt 8. Jan 2012, 14:39
Habe es jetzt über das Macro gelöst da das den Parametern recht nahe kommt
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf