Re: WHERE-Klausel
- From: "Olaf Pietsch" <olaf_pietsch@xxxxxxxxx>
- Date: Mon, 12 Dec 2005 19:55:42 +0100
Hallo Michael,
"Michael Bayer" <spamentsorgung@xxxxxxx> schrieb im Newsbeitrag
news:u2mfgux$FHA.4028@xxxxxxxxxxxxxxxxxxxx
> in meiner Applikation kann der Anwender verschiedene Bedingungen
> vorgeben, denen die von der Datenbank zurückzugebenden Datensätze
> entsprechen müssen, z.B.
>
....
> Auch das ist soweit kein Problem. Ich definiere die einzelnen
> Bedingungen als Parameter, die an die SP übergeben werden müssen
> (@PLZVon, @PLZBis, @ZAVon, @ZABis, @WFVon, @WFBis usw.).
>
> Die WHERE-Klausel lautet also beispielsweise:
>
> WHERE PLZ BETWEEN (@PLZVon AND @PLZBis)
> AND Zimmer BETWEEN (@ZAVon AND @ZABis)
> AND Wohnfläche BETWEEN (@WFVon AND @WFBis)
> AND Kaufpreis BETWEEN (@KPVon AND @KPBis)
> AND @Stellplatz = @SP
>
> usw.
>
> Aber: wie gehe ich vor, wenn der Anwender z.B. keinen PLZ-Bereich
> angibt oder wenn es ihm egal ist, ob ein Stellplatz vorhanden ist
> oder nicht?
> Die Parameter @PLZVon, @PLZBis und @Stellplatz müssen ja trotzdem an
> die SP übergeben werden, auch wenn sie gar nicht benötigt werden.
> Welche Werte übergebe ich diesen Parametern in diesem Fall und wie
> sieht die WHERE-Klausel aus?
Wenn man dynamisches SQL in Stored Procedures (SP) verwendet, dann hat man
eigentlich keinen echten Vorteil von den SP. Weiterhin ist zu beachten, dass
das dynamische SQL Statement im Kontext des aufrufenden User (SQL 2000)
ausgeführt werden muss und der User muss in der Regel SELECT-Berechtigungen
auf der Tabelle haben. Weiterhin ist der Code für das dynamische SQL nicht
einfach zu warten, da man sich leicht mit '-Zeichen verzählen kann und SQL
Injection ist bei dynamischem SQL nicht fern.
Wir vermeiden dynamisches SQL, wo es möglich ist:
(@p ist Parameter, der NULL ist, wenn dieser nicht verwendet werden soll.):
SELECT
....
WHERE
(col LIKE @p OR @p IS NULL)
AND
(....
oder wenn es eine Liste als Parameter ist (z. B. '1,2,3,4')
....
WHERE
....
col in (Select value From dbo.fn_split( @p, ','))
....
dbo.fn_split(), siehe
http://www.windowsitpro.com/Article/ArticleID/21071/21071.html?Ad=1
zu Deinem Beispiel:
Parameter: (@PLZVon, @PLZBis, @ZAVon, @ZABis, @WFVon, @WFBis usw.).
Für Parameter, die nicht gefüllt sind, kann man NULL übergeben.
....
WHERE
((PLZ BETWEEN (@PLZVon AND @PLZBis)) OR @PLZVon IS NULL OR @PLZBis IS NULL)
AND
(...)
AND
....
Gruß Olaf
--
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)
.
- Follow-Ups:
- Re: WHERE-Klausel
- From: Michael Bayer
- Re: WHERE-Klausel
- References:
- WHERE-Klausel
- From: Michael Bayer
- WHERE-Klausel
- Prev by Date: Re: dynamisches SQL mit Teilprozeduren
- Next by Date: WSUS & SQL 2005
- Previous by thread: Re: WHERE-Klausel
- Next by thread: Re: WHERE-Klausel
- Index(es):
Relevant Pages
|