![]() |
Datenbank: SQL Server 2000 • Zugriff über: SQL Skript
[SQL] Select mit dynamischer Parameteranzahl
Hi zusammen,
ich möchte eine SQL-Abfrage erstellen, bei der die Anzahl der Parameter noch nicht fest steht. z.B. soll nach verschiedenen Namen gesucht werden.
SQL-Code:
Wie kann ich eine solche Abfrage mit einer dynamischen Anzahl an zu suchenden Namen erstellen?
SELECT Name
FROM Tabelle WHERE Name like '%Meier%' or Name like '%Mueller%' Vielen Dank für eure Hilfe Lorenz |
Re: [SQL] Select mit dynamischer Parameteranzahl
Versuch es mal mit in
|
Re: [SQL] Select mit dynamischer Parameteranzahl
@mkinzler
in und like funktionieren zusammen? |
Re: [SQL] Select mit dynamischer Parameteranzahl
Stimmt könnte schwer werden.
Dann bietet sich eigentlich nur eine SP an, welche die Abfrage dynamisch generiert. |
Re: [SQL] Select mit dynamischer Parameteranzahl
Kannst du mit bitte einen Tipp geben, wie die SP aussehen kann?
|
Re: [SQL] Select mit dynamischer Parameteranzahl
Hallo,
in wird nicht funktionieren, da es keine Joker erlaubt. Eine etwas "blöde" Variante könnte sein:
SQL-Code:
Dieses SQL liefert natürlich kein Ergebnis aber:
SELECT Name
FROM Tabelle WHERE 1 = 2 Wenn Du nun hergehst und für jeden Namen ein OR anfügst, so bekommst Du ein gültiges SQL, dass Ergebnisse liefert und in der Zahl der zu suchenden Namen fast grenzenlos ist.
SQL-Code:
SELECT Name
FROM Tabelle WHERE 1 = 2 OR Name like '%Meier%' OR Name like '%Mueller%' ... OR Name like '%Zeppelin%' |
Re: [SQL] Select mit dynamischer Parameteranzahl
@nahpets:
Da sehe ich jetzt nicht, wie ich das mit dynamischen Parametern lösen könnte, dafür muss ich ja die Anzahl kennen. |
Re: [SQL] Select mit dynamischer Parameteranzahl
Zitat:
-gehst durch diese Liste und fügst dann die entsprechende Bedingung ein |
Re: [SQL] Select mit dynamischer Parameteranzahl
Hallo,
Zitat:
Leider weiß ich nicht, ob diese Verfahrensweise von jeder Datenbank unterstützt wird. |
Re: [SQL] Select mit dynamischer Parameteranzahl
Hallo,
von dem Vorgehen von nahpets #6 möchte ich abraten, weil dann der Vorteil von Parametern nicht genutzt werden kann. Alternativen werden in ![]() Vielleicht ist etwas davon eine sinnvolle Anregung. Gruß Jürgen Meine Güte, seid Ihr schnell. |
Re: [SQL] Select mit dynamischer Parameteranzahl
Hallo,
Zitat:
Natürlich könnte man hergehen und das SQL mit 10 Parametern versehen, diese, soweit Werte bekannt sind, entsprechend füllen und die verbleibenden Parametern mit solchen Werten versehen, die garantiert zu keinem Ergebnis führen (Frage, wie muss ein Namensparameter aussehen, damit der Name garantiert nicht gefunden wird?). Und was ist, wenn der 11. Parameter benötigt wird? Man könnte zur Laufzeit auch das SQL erweitern um die benötigte Anzahl von
SQL-Code:
und anschließend diese Parameter mit Werten versehen.
or Name like ':Parameter1' ... or Name like ':ParameterN'
Man hat hier zwei Möglichkeiten: Ein parametrisiertes, festes SQL, dass ggfls. nicht ausreicht oder mit Dummywerten versehen wird oder man baut es zur Laufzeit entsprechend den Anforderungen zusammen. Wenn ich die auf der verlinkten Seite gezeigte Verfahrensweise richtig interpretiere, wird dort letztlich ein Parameter gefüllt, der eine mehr oder weniger große Teilmenge der Wherebedingung enthält. Meine Post #6 und #9 führen letztlich zu genau diesem Ergebnis. |
Re: [SQL] Select mit dynamischer Parameteranzahl
Moin :)
WIe wär es mit einer Function im MSSQL-Server? Hab aus meinen Datenwühl-Verzeichnis mal was rausgekramt, was dir evtl weiterhelfen könnte (ohne Gewähr auf Funktionalität!):
SQL-Code:
Woher ich diesen Beispielcode habe, weiss ich nicht mehr (irgendwo im
CREATE FUNCTION [dbo].[fn_StringListToRecordset](@cList text)
RETURNS @retTable TABLE(Value varchar(50)) AS BEGIN DECLARE @aValue varchar(50), @aStartChar int, @aEndChar int; IF DATALENGTH ( @cList ) > 2 BEGIN SET @aStartChar = 1; WHILE (CHARINDEX(',', @cList,@aStartChar) <> 0) BEGIN SET @aEndChar = CHARINDEX(',', @cList,@aStartChar); SET @aValue = SUBSTRING(@cList, @aStartChar, @aEndChar - @aStartChar); SET @aStartChar = @aEndChar + 1; INSERT INTO @rettable(Value) VALUES(RTRIM(LTRIM(@aValue))); END SET @aValue = SUBSTRING(@cList, @aStartChar, DATALENGTH(@cList) - @aStartChar + 1); INSERT INTO @rettable(Value) VALUES(RTRIM(LTRIM(@aValue))); END RETURN END ![]() Prinzipiell funktioniert das ja so: an die Function eine 'Parameterliste' übergeben
SQL-Code:
; diese wird durch die WHILE-Schleife abgearbeitet und die Ergebnisse in einer Rückgabetabelle eingetragen.
SELECT * FROM fn_StringListToRecordset('"A","B","C"')
Im Prinzip liefert die Function ja das hier:
SQL-Code:
oder andere Schreibweise:
SELECT Name FROM Tabelle
WHERE Name like '%Meier%' or Name like '%Mueller%'
SQL-Code:
Also für Deinen Fall: egal, nach welchen Namen du suchen/filtern willst: alle 'Kandidaten' in die Übergabeliste eintragen und die entgsprechenden Datensätze werden dann aufgelistet... Natürlich musst du die Function da oben entsprechend deine Erfordernissen anpassen, aber ich denke der Weg dürfte klar sein!?
SELECT Name
FROM Tabelle WHERE Name like '%Meier%' UNION SELECT Name FROM Tabelle WHERE Name like '%Mueller% Rainer |
Re: [SQL] Select mit dynamischer Parameteranzahl
Zitat:
|
Re: [SQL] Select mit dynamischer Parameteranzahl
Zitat:
Gruss |
Re: [SQL] Select mit dynamischer Parameteranzahl
Ich hab es erstmal mit einer Abfrage gemacht, bei der sich in der WHERE-Klausel nur ein Suchbegriff befindet.
Das Resultat fülle ich in ein C#-DataSet. Nun führe ich die Abfrage für jedes Suchwort aus und erstelle ein neues DataSet. Am Ende werden die über die Merge-Methode zusammengeführt. Im Test ging das sogar sehr flott, ich werde es aber auch noch mal über die SP testen. Danke an alle!!! |
Re: [SQL] Select mit dynamischer Parameteranzahl
Zitat:
Wenn du es mit der SP nicht hinbekommen solltest, dann könntest Du es ja C#-technisch auch ungefähr so lösen:
Code:
getippt und nicht getestet!string s = "SELECT Name FROM tabelle WHERE Name LIKE '%{0}%' "; //--anhand der übergeben Parameterliste string selcmd = String.Format( s, paramListe[0].ToString() ); //--wenn mehr einträge in paramListe if (paramListe.Count > 1) { for (int i=1; i < paramListe.Count; i++ ) { selcmd += selcmd + "UNION " + String.Format(s, paramListe[i].ToString() ); } } Für die SP aus meinem Posting #12 müsstest du das INSERT-Statement ungefähr wie folgt anpassen:
SQL-Code:
Rainer
INSERT INTO @rettable(Value) (SELECT Name FROM tabelle WHERE Name LIKE '%'+(RTRIM(LTRIM(@aValue)))+'%');
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 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