2017-05-15 3 views
2

Überarbeitung einer vorhandenen gespeicherten Prozedur, um einen zuvor erforderlichen Parameter optional zu machen.SQL Multi-Condition WHERE-Klausel mit einem optionalen Parameter?

Die Abfrage ist massiv, und beschäftigt sich mit viel mehr als mein aktuelles Problem, also werde ich es nicht in seiner Gesamtheit veröffentlichen, aber ich glaube, dass ich meine Korrektur erhalten kann, indem Sie eine der WHERE Klauseln bearbeiten.

WHERE 
     O.wsID = @wsid AND 
     ((M.UpdateDate BETWEEN @olddate AND @newdate) OR (MI.UpdateDate BETWEEN @olddate AND @newdate)) 

Der erste Parameter @wsid ist der Wert I optional machen muß, wird es zunächst als 0 und gegeben einen neuen Wert aus einer Auswahlbox auf dem Front-End der Website erklärt. Ich habe versucht, eine CASE Anweisung zu verwenden, um zwischen WHERE Klauseln zu wechseln, abhängig davon, ob der Wert 0 oder eine tatsächliche ID ist.

WHERE 
     @wsid = CASE 
       WHEN @wsid <> 0 THEN ((O.wsID = @wsid) AND ((M.UpdateDate BETWEEN @olddate AND @newdate) OR (MI.UpdateDate BETWEEN @olddate AND @newdate))) 
       ELSE ((M.UpdateDate BETWEEN @olddate AND @newdate) OR (MI.UpdateDate BETWEEN @olddate AND @newdate))) 
       END 

Aber ich habe eine Reihe von Syntaxfehlern in der WHERE Klausel selbst und auch einen Fehler, der besagt Expecting CONVERSATION or TRY für die SELECT unter Anweisung.

Gibt es eine einfachere Option, um den Parameter O.wsid = @wsid optional zu machen?

Antwort

2
WHERE 
     (O.wsID = @wsid OR @wsid = 0) AND 
     ((M.UpdateDate BETWEEN @olddate AND @newdate) OR (MI.UpdateDate BETWEEN @olddate AND @newdate)) 
+0

Ich kann nicht glauben, dass es so einfach war ... ah gut, das ist Montagmorgen für dich. Danke, funktioniert perfekt. – Wompguinea

+1

Seien Sie vorsichtig, "ODER @wsid = 0" kann einen Tabellenscan verursachen. OPTION (RECOMPILE) verhindert dies. – under

+0

@unter ja, du hast Recht. Es kann manchmal schmerzhaft sein – Backs

Verwandte Themen