条款参数的存储过程

时间:2011-06-08 00:11:30

标签: asp.net sql-server tsql stored-procedures where-clause

我有一个ASP.net搜索页面,用户可以在其中输入一个或多个搜索条件。该页面调用存储过程来查询MS SQL Server 2008 db。

部分搜索条件是单日期或日期范围。如果用户提供Date1,我们搜索单个日期。如果用户提供Date1和Date2,我们会搜索日期范围。

我的问题是在存储过程中对此逻辑进行编码。

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

所以有三个条件:

  1. @ Date1和@ Date2均为空(用户未在日期上搜索)
  2. @ Date1不为null且@ Date2为空(用户在单个日期搜索)
  3. @ Date1不为null且@ Date2不为null(用户正在搜索日期范围)
  4. 我无法弄清楚如何构造WHERE子句来处理三种可能的条件。

    我熟悉ISNULL()COALESCE()

    非常感谢任何提示或建议。

2 个答案:

答案 0 :(得分:4)

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 :(得分:1)

您可以尝试在SP中创建SQL查询作为字符串,然后执行它,如下所示:

...
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)