【发布时间】:2015-08-07 03:00:19
【问题描述】:
我有一个基本查询,用于根据在 UI 上选择的过滤器选项获取搜索结果。
在我的表中,我有一个名为 expirationDate 的日期列,它是文档过期的日期(不做任何事情,仅供参考)。
好吧,在 UI 中,有一个选项可以选择您想要查看的状态;已过期或有效。
根据您选择的查询,我需要更改查询,但不确定如何进行,因为它与日期有关,而不仅仅是它必须检查的状态列。
在下面的查询中,如果 status = Active,我需要添加到 WHERE 子句,以便 expireDate 没有超过今天的日期(意味着它还没有过期)。但是,如果我选择过期,我需要 WHERE 子句包含过期日期尚未超过今天日期的任何内容(活动项目)。
IF(@employee = '') SET @employee = NULL;
IF(@supervisor = '') SET @supervisor = NULL;
IF(@manager = '') SET @manager = NULL;
IF(@location = '') SET @location = NULL;
IF(@skillset = '') SET @skillset = NULL;
IF(@category = '') SET @category = NULL;
IF(@type = '') SET @type = NULL;
IF(@status = '') SET @status = NULL;
SELECT recordID,
employeeQID,
firstName,
lastName,
department,
location,
supervisorQID,
supervisorFirstName,
supervisorLastName,
managerQID,
managerFirstName,
managerLastName,
documentationType,
documentationCategory,
CONVERT(VARCHAR(10), startDate, 101) AS startDate,
CONVERT(VARCHAR(10), expirationDate, 101) AS expirationDate,
notes,
skillset,
timestamp,
creator
FROM dbo.documentation_records
WHERE (@employee IS NULL OR (employeeQID = @employee))
AND (@supervisor IS NULL OR (supervisorQID = @supervisor))
AND (@manager IS NULL OR (managerQID = @manager))
AND (@location IS NULL OR (location = @location))
AND (@skillset IS NULL OR (skillset = @skillset))
AND (@category IS NULL OR (documentationCategory = @category))
AND (@type IS NULL OR (documentationType = @type))
FOR XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root');
处理此问题的最佳方法是什么,同时还允许状态为 NULL,如果没有像我对其他 vars 所做的那样在 UI 中选择作为过滤器选项,则将其忽略。
【问题讨论】:
-
Dynamic SQL 就是答案,看看提供给这个问题的答案,
Dynamic Filters in SQL server -
这是一篇关于此类查询的优秀文章。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries
-
@M.Ali 你不需要动态 SQL,Dynamis SQL 对于一些 OR 和 AND 语句来说太过分了
标签: sql-server sql-server-2008 tsql stored-procedures