![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: TSQL
MSSQL: WHERE in Stored Procedure "optional gestalten&qu
Gibt es eine Möglichkeit CASE oder IF in der WHERE Clause zu verbauen, um Bedingungen auszuschliessen ?
Kleines abstraktes Beispiel:
SQL-Code:
Bisher löse ich das so ...
CREATE PROCEDURE TEST
@inc_Offene BIT = 0 @inc_Erledigte BIT = 0 @CheckError BIT = 0 AS BEGIN --Parameter prüfen SELECT @CheckError = CASE WHEN (@inc_Offene = 0) AND (@inc_Erledigte =0) THEN 1 ELSE 0 END IF @CheckError = 1 BEGIN RAISEERROR('SP_TEST: Mindestens ein Parameter muß 1 sein',16,1,'Parameter Error') END ELSE BEGIN SELECT bla, bla1, bla2 FROM Tabelle1 -- ab hier wirds interessant -- geht so nicht ... WHERE CASE WHEN @inc_Offene=1 AND @inc_Erledigte=0 THEN (stat_Offen = 1) AND (stat_inArbeit = 1) AND (stat_Erledigte =0) ELSE CASE WHEN @inc_Offene=0 AND @inc_Erledigte=1 THEN (stat_Offen = 0) AND (stat_inArbeit = 0) AND (stat_Erledigte =1) ELSE ID IS NOT NULL END END -- IF geht auch nicht :-( ... END END nur dabei wird die SP unübersichtlich und laaaaaang ....
SQL-Code:
Für dieses kleine Beispiel wäre eine Query mit Parametern sicher besser angebracht...
IF @inc_Offene = 1 AND @inc_Erledigte = 0
BEGIN SELECT bla, bla1, bla2 FROM Tabelle1 WHERE (stat_Offen = 1) AND (stat_inArbeit = 1) AND (stat_Erledigte =0) END IF @inc_Offene = 0 AND @inc_Erledigte = 1 BEGIN SELECT bla, bla1, bla2 FROM Tabelle1 WHERE (stat_Offen = 0) AND (stat_inArbeit = 0) AND (stat_Erledigte =1) END IF @inc_Offene = 1 AND @inc_Erledigte = 1 BEGIN SELECT bla, bla1, bla2 FROM Tabelle1 END Die SP, die ich mit der WHERE "Bedingung" einkürzen will ist jedoch knapp 300 Zeilen lang und hat ihre Existenzberechtigung ... Kann man die Where Clause überhaupt "optionalisieren" ? :gruebel: :hi: Danke ... Jens |
Re: MSSQL: WHERE in Stored Procedure "optional gestalte
Moin,
probier es doch einfach mal aus. Natürlich kannst du das machen...
SQL-Code:
MfG
SELECT bla, bla1, bla2
FROM Tabelle1 WHERE (stat_Offen = @inc_Offene) AND (stat_Erledigte = @inc_Erledigte) Thorsten |
Re: MSSQL: WHERE in Stored Procedure "optional gestalte
Hmmm ja :roll: ,
das Beispiel war etwas unglücklich formuliert. :oops: Anders ... Ich versuche die WHERE Clause in Abhängigkeit von den übergebenen Parametern individuell zu gestalten. "Unbenutzte Parameter" könnte man mit % oder IS NOT NULL o.Ä. "unschädlich" machen aber darauf möchte ich möglichst verzichten ... Dieses Beispiel ist besser ...
SQL-Code:
CREATE PROCEDURE TEST
@SearchByID BIT = 0 @SearchByName BIT = 0 @ID UNIQUEIDENTIFIER = NULL @Nachmane VATCHAR(20) = NULL AS BEGIN SELECT bla, bla1, bla2 FROM Tabelle1 -- ab hier wirds interessant -- geht so nicht ... WHERE CASE WHEN @SearchByID=1 --Wenn SearchByID = 1 übergeben wurde WHERE Clause auf ID=@ID setzen THEN ID=@ID ELSE CASE WHEN @SearchByName=1 --Wenn SearchByName = 1 übergeben wurde WHERE Clause THEN Name=@Nachname --auf Name@Nachname setzen ELSE ID IS NOT NULL -- sonst alle suchen (da ID in Tabelle1 nie NULL ist) END END END :hi: |
Re: MSSQL: WHERE in Stored Procedure "optional gestalte
Zitat:
<search_condition> ist das, was hinter WHERE steht. <predicate> kann entweder True oder False sein.
Code:
<search_condition> ::=
{ [ NOT ] <predicate> | ( <search_condition> ) } [ {AND | OR} [NOT] {<predicate> | ( <search_condition> ) } ] } [,...n] <predicate> ::= { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression | string_expression [NOT] LIKE string_expression [ ESCAPE 'escape_character' ] | expression [NOT] BETWEEN expression AND expression | expression IS [NOT] NULL | CONTAINS ( { column | * } , '< contains_search_condition >' ) | FREETEXT ( {column | * }, 'freetext_string' ) | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY} ( subquery ) | EXISTS ( subquery ) } |
Re: MSSQL: WHERE in Stored Procedure "optional gestalte
Moin,
ich will da nicht gleich sagen => DAS GEHT NICHT es sind sehr viele Tricks möglich. ich versuche es einfach nochmal...
SQL-Code:
Kommt das deinem Wunsch näher?
SELECT bla, bla1, bla2
FROM Tabelle1 WHERE ( ( @SearchByID = 1 AND ID = @ID) OR ( @SearchByID <> 1 AND ( (@SearchByName = 1 AND Name = @Nachname) OR (@SearchByName <> 1 AND ID IS NOT NULL)))) MfG Thorsten |
Re: MSSQL: WHERE in Stored Procedure "optional gestalte
@omata
das funktioniert auf alle Fälle... Lieber wäre mit eine Lösung, in der ich den WHERE-Block pro Ausschluss-Parameter kurz und knapp definieren könnte, aber das scheint wohl mit TSQL unmöglich zu sein. Da die besagte SP derzeit 12 Ausschluss-Parameter und 10 "Daten-Input"-Parameter hat und mir eine WHERE-Clause mit allen Eventualitäten zu unübersichtlich wird, werde ich die SP jetzt endlich teilen. Ich baue mir eine SP in der ich die ganzen Parameter analysiere und führe dann je nach Fall mit EXEC eine entsprechende "SUB Procedure" aus, die nur mit den notwendigen Parametern aufgerufen wird, und die halt das jeweilige SELECT startet ... Früher oder später wäre ich doch nicht dran vorbeigekommen, die dicke SP zu teilen ... :roll: Danke für Eure Tips, Jens :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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