如何在SQL查询中基于条件动态注入筛选条件且保留单查询结构
存储过程多维度动态筛选实现方案
你可以直接通过NULL判断结合OR逻辑实现单查询结构下的动态条件注入,不需要拆分查询或者拼接动态SQL,完全适配你设定的参数互斥规则。
修改后的完整代码如下:
@EmployeeId int, @DepartmentId int, -- 其余原有参数如@CityId、@FromDate、@ToDate保持不变 SET @NewLeadForSales = (SELECT SUM(SaleStats) FROM SaleSummary AS SS (nolock) INNER JOIN CustomerSale AS CS ON SS.SaleId = CS.SaleId WHERE CS.CityId = @CityId -- 动态适配员工/部门维度筛选 AND ( (@EmployeeId IS NOT NULL AND CS.EmployeeId = @EmployeeId) OR (@DepartmentId IS NOT NULL AND CS.DepartmentId = @DepartmentId) ) AND SS.Type = 'Lead' AND SS.Name = 'Sale' AND (DATEFROMPARTS(SS.SaleYear, SS.SaleMonth, 1) >= @FromDate AND DATEFROMPARTS(SS.SaleYear, SS.SaleMonth, 1) < @ToDate));
逻辑说明
- 当查询员工维度时,
@DepartmentId为NULL,部门维度的判断分支自动失效,仅员工筛选条件生效 - 当查询部门维度时,
@EmployeeId为NULL,员工维度的判断分支自动失效,仅部门筛选条件生效
性能优化建议
如果数据量较大,担心OR条件引发执行计划选择异常,可以在查询末尾增加OPTION (RECOMPILE)提示,每次执行会根据当前传入的参数重新生成最优执行计划,不会影响查询效率:
-- 在原有查询语句末尾添加 OPTION (RECOMPILE)
内容的提问来源于stack exchange,提问作者I Love Stackoverflow
相关产品推荐
相关产品推荐

