AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken C# [SQL] Select mit dynamischer Parameteranzahl
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Select mit dynamischer Parameteranzahl

Ein Thema von Reinhardtinho · begonnen am 20. Feb 2009 · letzter Beitrag vom 3. Mär 2009
Antwort Antwort
Seite 2 von 2     12   
nahpets
(Gast)

n/a Beiträge
 
#11

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 20. Feb 2009, 11:41
Hallo,
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 vonor 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.
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#12

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 20. Feb 2009, 22:47
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
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 21. Feb 2009, 07:27
Zitat:
WIe wär es mit einer Function im MSSQL-Server?
Die Verwendung einer SP hatte ich ausch schon vorgeschlagen
Markus Kinzler
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#14

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 22. Feb 2009, 14:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#15

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 3. Mär 2009, 07:41
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!!!
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#16

Re: [SQL] Select mit dynamischer Parameteranzahl

  Alt 3. Mär 2009, 11:40
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:
INSERT INTO @rettable(Value) (SELECT Name FROM tabelle WHERE Name LIKE '%'+(RTRIM(LTRIM(@aValue)))+'%'); Rainer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:05 Uhr.
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