Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   C# [SQL] Select mit dynamischer Parameteranzahl (https://www.delphipraxis.net/129510-%5Bsql%5D-select-mit-dynamischer-parameteranzahl.html)

nahpets 20. Feb 2009 11:41

Re: [SQL] Select mit dynamischer Parameteranzahl
 
Hallo,
Zitat:

Zitat von Jürgen Thomas
Hallo,

von dem Vorgehen von nahpets #6 möchte ich abraten, weil dann der Vorteil von Parametern nicht genutzt werden kann. Alternativen werden in FIBPlus + IN () - ParamByName(..).As.. besprochen.

Vielleicht ist etwas davon eine sinnvolle Anregung.

Gruß Jürgen

Meine Güte, seid Ihr schnell.

jain, natürlich geht bei meiner Methode der Vorteil von Parametern flöten, aber mir ist keine Möglichkeit bekannt, ein SQL mit Parametern zu versehen, von denen ich zu Entwicklungszeit die Menge der Parameter nicht kenne.
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:
or Name like ':Parameter1' ... or Name like ':ParameterN'
und anschließend diese Parameter mit Werten versehen.
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.

raiguen 20. Feb 2009 22:47

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:
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
Woher ich diesen Beispielcode habe, weiss ich nicht mehr (irgendwo im WWW...)

Prinzipiell funktioniert das ja so: an die Function eine 'Parameterliste' übergeben
SQL-Code:
SELECT * FROM fn_StringListToRecordset('"A","B","C"')
; diese wird durch die WHILE-Schleife abgearbeitet und die Ergebnisse in einer Rückgabetabelle eingetragen.
Im Prinzip liefert die Function ja das hier:
SQL-Code:
SELECT Name FROM Tabelle
WHERE Name like '%Meier%' or Name like '%Mueller%'
oder andere Schreibweise:
SQL-Code:
SELECT Name
FROM Tabelle
WHERE Name like '%Meier%'
UNION
SELECT Name FROM Tabelle WHERE Name like '%Mueller%
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!?

Rainer

mkinzler 21. Feb 2009 07:27

Re: [SQL] Select mit dynamischer Parameteranzahl
 
Zitat:

WIe wär es mit einer Function im MSSQL-Server?
Die Verwendung einer SP hatte ich ausch schon vorgeschlagen

raiguen 22. Feb 2009 14:00

Re: [SQL] Select mit dynamischer Parameteranzahl
 
Zitat:

Zitat von mkinzler
Zitat:

WIe wär es mit einer Function im MSSQL-Server?
Die Verwendung einer SP hatte ich ausch schon vorgeschlagen

Richtig - mein Posting sollte ergänzend dazu mal einen weiteren Tipp/Hinweis geben ;)
Gruss

Reinhardtinho 3. Mär 2009 07:41

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!!!

raiguen 3. Mär 2009 11:40

Re: [SQL] Select mit dynamischer Parameteranzahl
 
Zitat:

Zitat von Reinhardtinho
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.
...

Naja, bei kleinerne Datenmengen mag das ja hinreichend flott sein - obwohl ich das schon recht 'overheaded' finde mit den DataSets. Aber immerhin erstmal eine 'brauchbare' Lösung.

Wenn du es mit der SP nicht hinbekommen solltest, dann könntest Du es ja C#-technisch auch ungefähr so lösen:

Code:

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() );
    }
  }
getippt und nicht getestet!

Für die SP aus meinem Posting #12 müsstest du das INSERT-Statement ungefähr wie folgt anpassen:
SQL-Code:
INSERT INTO @rettable(Value) (SELECT Name FROM tabelle WHERE Name LIKE '%'+(RTRIM(LTRIM(@aValue)))+'%');
Rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz