Хранимая процедура где параметры пункта - PullRequest
4 голосов
/ 08 июня 2011

У меня есть страница поиска ASP.net, где пользователь может ввести один или несколько критериев поиска.Страница вызывает хранимую процедуру для запроса базы данных MS SQL Server 2008.

Часть критериев поиска - это одна дата или диапазон дат.Если пользователь указывает дату1, мы ищем только одну дату.Если пользователь указывает дату1 и дату2, мы выполняем поиск в диапазоне дат.

Моя проблема заключается в кодировании этой логики в хранимой процедуре.

@Date1 datetime
@Date2 datetime
..other search params...

Итак, существует три условия:

  1. И @ Date1, и @ Date2 имеют значение NULL (пользователь не выполняет поиск по датам)
  2. @ Date1 не имеет значение NULL, а @ Date2 имеет значение NULL (пользователь выполняет поиск по одной дате)
  3. @ Date1 не равно нулю, а @ Date2 не равно нулю (пользователь ищет диапазон дат)

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

Я знаком с ISNULL() и COALESCE()

Любые советы или предложения приветствуются.

Ответы [ 2 ]

4 голосов
/ 08 июня 2011
CREATE PROCEDURE BLABLABLA(
  @DATE1 DATETIME = NULL,
  @DATE2 DATETIME = NULL
)
AS
BEGIN
  SELECT COL1, COL2
  FROM THE_TABLE
  WHERE 
    THE_TABLE.DATETIMEFIELD BETWEEN 
      ISNULL(@DATE1, THE_TABLE.DATETIMEFIELD) 
      AND COALESCE(@DATE2, @DATE1, THE_TABLE.DATETIMEFIELD)
END

Другой вариант, который теряет некоторую выразительность, но, вероятно, использует индексы, может быть:

CREATE PROCEDURE BLABLABLA(
  @DATE1 DATETIME = NULL,
  @DATE2 DATETIME = NULL
)
AS
BEGIN
  SELECT COL1, COL2
  FROM THE_TABLE
  WHERE 
    (THE_TABLE.DATETIMEFIELD >= @DATE1 OR @DATE1 IS NULL) 
     AND (THE_TABLE.DATETIMEFIELD <= @DATE2 
         OR THE_TABLE.DATETIMEFIELD = @DATE1
         OR (@DATE1 IS NULL AND @DATE2 IS NULL)) 
END
1 голос
/ 08 июня 2011

Вы можете попытаться создать свой запрос SQL в виде строки в SP, а затем выполнить его, например:

...
declare @sql varchar(500)
set @sql = 'select from myTable where 1=1'

if(@Date1 <> null)
    set @sql = @sql + ' and date1 >= '+ @date1

if(@Date2 <> null)
    set @sql = @sql + ' and date2 <= '+ @date2

print(@sql) -- for debug 
exec(@sql)
...