2017-05-15 84 views
2

重做現有存儲過程以使先前需要的參數成爲可選參數。帶有一個可選參數的SQL多條件WHERE子句?

該查詢是巨大的,處理比我當前的問題更多,所以我不會發布它的全部,但我相信我可以通過編輯WHERE子句之一來獲得我的修復程序。

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

的第一個參數是@wsid我需要做可選的價值,它的最初聲明爲0,並從一個選擇框的網站的前端賦予了新的價值。我試圖使用CASE語句在WHERE子句之間切換,具體取決於值是0還是實際ID。

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 

但我得到的WHERE條款本身就是一堆語法錯誤,並錯誤,指出Expecting CONVERSATION or TRY下面的SELECT聲明。

是否有更容易的選項使O.wsid = @wsid參數可選?

回答

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

我簡直不敢相信那麼簡單......好吧,那就是星期一上午。謝謝,完美的作品。 – Wompguinea

+1

只需要小心,「OR @wsid = 0」可能會導致表掃描。選項(RECOMPILE)防止這種情況發生。 – under

+0

@下是的,你說得對。有時候這可能是痛苦的 – Backs