![]() |
Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Hi :),
ich steh grad irgendwie auf dem Schlauch.:pale: Ich habe eine CheckListBox wo Mitarbeiternamen drin stehen. Wenn ich dort welche Auswähle soll deren Namen in eine SQL Abfrage übergeben werden. Ich habe eine Schleife gebaut, mit der dann geschaut wird, welche selected sind und deren Namen wird dann dem Parameter zugewiesen der dann in der SQL später gesetzt wird. Nun hab ich das Problem, dass immer der letzte Mitarbeiter wo selected ist nur übergeben wird (ist mir auch klar warum, bei jedem Schleifendurchlauf wird der vorherige überschrieben). Aber wie mach ich es denn, dass ich mehrere Mitarbeiternamen übergeben kann an den SQL Parameter? :oops:
Code:
for i := 0 to CheckListBox1.Items.Count-1 do begin if CheckListBox1.Selected[i] then ADOQuery.Parameters.ParamByName('USR_NAME').Value := LOWERCASE(CheckListBox1.Items[i]); end; |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Das geht so nicht.
Das Statement müsste dann ja in etwa "select * from Tabelle where user_name in ('name1', 'name2')" lauten. Den IN - String musst du in deiner Schleife zusammensetzen. Die Abfrage musst du dynamisch zusammenbauen oder Makros verwenden (wenn die Komponente das kann). Frank |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Hmm naja, dann kann ich gleich für jeden Mitarbeiter ein einzelnen Parameter anlegen und wenn halt nur 4/5 ausgewählt sind, dann bleibt der 5. halt leer...
Hat vllt jemand einen ganz anderen Ansatz? :oops: |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Ich glaube, das ist so in der Form mit Parametern nicht machbar.
Ein Parameter nimmt nur einen Wert auf. Die einfachste Lösung via "in clause" ist tatsächlich, die Werteliste zusammenzubasteln und fest im Statement zu übergeben. Es gäbe noch abgefahrene Sachen mit (temporären, session spezifischen) Tabellen, die die Selektion aufnehmen und die Abfrage dann nicht per "in clause", sondern per join auf die Selektionstabelle machen. Das birgt aber einige Risiken, weil Mehrfachzugriff sicher gelöst sein muss. Ist aufwendig und macht vielleicht Sinn, wenn man große Mengen selektiert. Dafür sollte es dann aber auch recht flott sein. |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Eine andere Möglichkeit wäre es immer nur einen Namen (personalnummern gibt es nicht?) zu übergeben, und dementsprechend auch nur einen Datensatz als Ergebnis zu bekommen. Wenn man mehr als 5,10,20 Namen abfragt, ist das allerdings durchaus eine Bremse.
Was spricht dagegen den "in clause" dynamisch zu erstellen? Gruß K-H Zitat:
Aber sonst, gute Lösung. |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Zitat:
Inhalt parameter abc ",12,34,56,89," "select * from tabelle where :abc containing ','||tabelle.id||','" die Konstruktion kann beliebig lang sein, wird aber garantiert nicht indiziert laufen, daher auf größeren Tabellen eine begrenzt sinnvolle Idee, aber wenn die daten aus einer Checklistbox kommen, werden da sicher nicht 10 mio Einträge drin sein. Wenn das ggf eh über den Umweg einer SP läuft, würde ich in FB die daten vorher in eine global temporary table eintragen und die dann an die restlichen Tabellen dran joinen, konnte deinem posting aber nicht die gewünschte PLattform entnehmen, bei ADO vermute ich meistens was von MS .... |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Datenbanken kennen Array-Parameter, aber fast alle Zugriffskomponenten nicht ... seltene Ausnahmen bestätigen die Regel.
Man kann den "Parameter" auch via Funktionen ala string_to_array wieder in arrays/records zerlegen und dann z.B. mit
SQL-Code:
, nachdem man ihn vorher im Client zu einen String zusammengesetzt hat.
IN
Die Variante den einen Array-Parameter über mehrere einzelne Parameter übergeben zu wollen ist aber die umständlichste Variante.
SQL-Code:
nutze ich auch manchmal, allerdings da dann über ein Makro
user_name in ('name1', 'name2')
SQL-Code:
und die "Strings" mit der Escape-Funktion der DB-Zugriffskomponente ordentlich maskiert und erst dann zur komma-separierten Liste zusammengefügt.
user_name in (&NameList)
|
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Hi:)
sorry für die späte Antwort. Also habe jetzt mal die Ausgewählten Mitarbeiter in seinen String gepackt und dem Parameter USR_NAME für die SQL zugewiesen. Dieser sieht jetzt ungefähr so aus:
Code:
So aber wie geht es jetzt in der SQL weiter. Ich muss die Namen ja vom ',' trennen. :?: Habe mir jetzt mal string_to_array & SUBSTRING_INDEX angeschaut aber komme nicht so voran, dass es klappt. Hat jemand ein bsp oder so?:pale:
maier,mueller,schmidt,
[EDIT]Das müsste ja dann ca. so aussehen:
Code:
:?::?
WHERE user_name IN TRENNE_STR_VON_KOMMA(:USR_NAME)
Zitat:
[/EDIT] |
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Nach einer Stunde googeln und probieren habe ich es herausgefunden. :-D
FIND_IN_SET(table, commaSeparatedData) bringt das gewünschte Ergebnis. In meinem Fall sieht das Ergebnis nun so aus:
Code:
... WHERE FIND_IN_SET(usr.usr_name, :USR_NAME)
|
AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 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