繁体   English   中英

具有WHERE子句逻辑的SQL Server存储过程

[英]SQL Server stored procedure with WHERE clause logic

我的应用程序中有一个结果表,还有一个框,允许用户按一个或多个值过滤结果集。

我必须在记录中添加一个可选的 needBy日期,以便一个人可以指定他们是否需要在某个日期之前处理请求。

我正在努力的部分是可选日期结构的过滤。 我的过滤器如下:

  • 当前=所有需要的日期小于或等于今天的请求
  • 将来=所有需要的日期大于今天的请求
  • 全部=按日期需要和不需要的所有请求

这是我的查询示例。 WHERE一切期望@needBy工作就好了。

SELECT 
    * 
FROM 
    TABLE
WHERE 
    (@requestor IS NULL OR r.Requestor = @requestor) 
    AND
    (@user IS NULL OR t.QID = @user)
    AND
    (@tool IS NULL OR t.ToolID = @tool)
    AND
    (@role IS NULL OR t.RoleID = @role)
    AND
    (@action IS NULL OR t.ActionID = @action)
    AND
    (@status IS NULL OR t.StatusID = @status)
    AND
    (@needBy IS NULL OR CASE 
                            WHEN @needBy = 'current' THEN r.NeedByDate <= GETUTCDATE()
                            WHEN @needBy = 'future' THEN r.NeedByDate > GETUTCDATE()
                            WHEN @needBy = 'all' THEN r.NeedByDate IS NOT NULL
                        END)

我应该如何以不同的方式处理日期查询? 另一个问题是@needBy = 'all' 在这种情况下,我需要所有记录,无论它有将来,过去或提供的日期。

在上面的代码中,似乎不喜欢WHEN/THEN语句中的逻辑运算符。

您从OR条件入手,只需要一路走下去:

SELECT 
    * 
FROM 
    TABLE
WHERE 
    (@requestor IS NULL OR r.Requestor = @requestor) 
    AND
    (@user IS NULL OR t.QID = @user)
    AND
    (@tool IS NULL OR t.ToolID = @tool)
    AND
    (@role IS NULL OR t.RoleID = @role)
    AND
    (@action IS NULL OR t.ActionID = @action)
    AND
    (@status IS NULL OR t.StatusID = @status)
    AND
    (@needBy IS NULL OR 
         (@needBy = 'current' AND r.NeedByDate <= GETUTCDATE()) OR 
         (@needBy = 'future'  AND r.NeedByDate > GETUTCDATE()) OR 
         (@needBy = 'all' AND r.NeedByDate IS NOT NULL)
     )

请注意,由于所有查询都是基于一组参数(可能不是最适合下一组参数的最佳参数)进行编译的,因此其执行计划通常效率不高。
一种解决方案是将OPTION(RECOMPILE)添加到存储过程。 有关更多信息,请参阅此博客文章

您不需要CASE

 (@needBy IS NULL OR 
   ( @needBy = 'current' AND r.NeedByDate <= GETUTCDATE() )
   OR 
   ( @needBy = 'future' AND r.NeedByDate > GETUTCDATE() )
   OR 
   ( @needBy = 'all' AND r.NeedByDate IS NOT NULL )
                       )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM