2013-04-09 31 views
1

在我的存儲過程中有輸入參數。例如,條件在where子句中帶有可選參數

DECLARE @fromDate DateTime = NULL 
DECLARE @toDate DateTime = NULL 
DECLARE @Id int = NULL 

我想要寫在where子句一樣......如果提供沒有fromdate然後搜索必須在@fromDate做的條件。如果不能提供@fromDate然後檢查@Id變量,如果這不是空然後@Id搜索基礎...

喜歡的東西...

where 
    CASE 
    when @fromDate is not null 
    THEN (@FromDate is null or ([Created] between @FromDate and @ToDate)) 
    ELSE (@requestId is null or [email protected]) 

有一個問題下面的解決方案。 ..if @fromDate和@Id都提供,那麼這將做他們的intesect,沒有什麼是返回.....條件應該是...如果@fromDate給予的優先級給@fromDate,即使@Id是提供的和結果不能依賴於@Id參數....

+0

你爲什麼要*支持*的能力,通過一個非空' @ fromDate'和'@ Id'但是忽略*其中之一?如果我打電話給你的程序併爲他們傳遞價值觀,我當然不會期望它按照你所描述的去做。 – 2013-04-09 06:27:09

+0

無論如何,尋找這樣的東西的通常地點是Erland Sommarskog的[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html) – 2013-04-09 06:28:06

回答

1

因爲你依賴於這兩個參數比你可以用它們狀況:

where 
(@FromDate is null or ([Created] between @FromDate and @ToDate)) 
or 
((@requestId is null or [email protected]) 
    and @FromDate is null) ----mix @requestId & @FromDate 
0

你的意思是?請檢查:

WHERE [Created] BETWEEN 
    (CASE WHEN @FromDate IS NOT NULL THEN @FromDate ELSE [Created] END) AND 
    (CASE WHEN @ToDate IS NOT NULL THEN @ToDate ELSE [Created] END) AND 
    Id=(CASE WHEN @requestId IS NOT NULL THEN @requestId ELSE Id END)