2017-05-15 55 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