2013-04-09 8 views
1

В моей хранимой процедуре есть параметр ввода. например,условие в где предложение с необязательным параметром

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

Я хочу написать условие в том, где положение как ... если обеспечивается 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 оба предоставлены, тогда это будет их интуитивно, и ничего не будет возвращено ..... условие должно быть похоже ... если @fromDate присваивается приоритет, он дает @fromDate, даже если @Id является при условии, и результат не должен зависеть от параметра @Id ....

+0

Почему вы хотите * Поддержка * возможность передавать ненулевым ' @ fromDate' и '@ Id', но затем * игнорировать * один из них? Если бы я называл вашу процедуру и передавал значения для обоих из них, я, конечно, не ожидал, что она будет делать то, что вы описываете. –

+0

Во всяком случае, обычным местом для поиска чего-то подобного является [Динамические условия поиска в T-SQL] Эрланда Соммарскога (http://www.sommarskog.se/dyn-search.html) –

ответ

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)