SSRS 2014中带OR子句的日期范围参数失效问题求助
问题原因
你的查询失效是因为当@SalesOrdPO为空时,SalesOrders_Rpt.SalesOrdPO like '%' + @SalesOrdPO + '%'会变成like '%%',这个条件会匹配所有记录。OR逻辑下只要其中一个条件成立就会返回数据,所以不管日期范围是否符合,所有数据都会被拉取,导致日期过滤失效。同理,如果日期参数为空,也会出现类似问题。
解决方案
需要给每个过滤条件加上参数非空时才生效的判断,确保只有当用户输入了对应参数时,该条件才会参与过滤。修改后的查询如下:
SELECT [OrdNum] ,[EcommOrdNum] ,[SalesOrdPO] ,[cust_num] ,[cust_seq] ,[CorpCustNum] ,[CorpName] ,[CustName] ,[Address] ,[Address2] ,[City] ,[State] ,[Zip] ,[ShipVia] ,[Item] ,[Qty] ,[Price] ,[OrderDate] ,[ShipDate] ,[SerialNum] ,[Shipping] ,[Tracking] ,[OrderStat] FROM [CRM].[dbo].[SalesOrders_Rpt] WHERE SalesOrders_Rpt.CorpCustNum = ' 321654' AND ( -- 仅当日期参数都不为空时,应用日期范围过滤 (@StartDate IS NOT NULL AND @EndDate IS NOT NULL AND SalesOrders_Rpt.OrderDate >= @StartDate + '00:00:00.000' AND SalesOrders_Rpt.OrderDate <= @EndDate + '23:59:59.000') OR -- 仅当PO参数不为空/非空字符串时,应用模糊匹配 (@SalesOrdPO IS NOT NULL AND @SalesOrdPO <> '' AND SalesOrders_Rpt.SalesOrdPO LIKE '%' + @SalesOrdPO + '%') OR -- 可选:如果需要两个参数都为空时返回所有符合CorpCustNum的数据,保留此条;否则删除 (@StartDate IS NULL AND @EndDate IS NULL AND (@SalesOrdPO IS NULL OR @SalesOrdPO = '')) )
关键说明
- 单独日期过滤:输入
@StartDate和@EndDate,留空@SalesOrdPO,此时只有日期条件生效 - 单独PO过滤:输入
@SalesOrdPO,留空日期参数,此时只有PO模糊匹配条件生效 - 同时过滤:两个参数都输入,此时两个条件同时生效,返回同时符合日期范围和PO匹配的数据
- 若不需要两个参数都为空时返回所有数据,删除最后一个OR分支即可
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

