SSRS报表存储过程参数筛选异常问题技术问询
排查SSRS报表存储过程筛选逻辑异常问题
我来帮你解决这个困扰——当你设置RenewalNotAllowed为'N'时报表仍显示'Y'的记录,核心问题出在存储过程WHERE子句的逻辑优先级错误上。
问题根源分析
SQL中AND的执行优先级远高于OR,你原存储过程的WHERE子句会被数据库自动解析成以下逻辑:
WHERE (FirstName LIKE (CASE WHEN @Adjustername IS NULL THEN FirstName ELSE @Adjustername + '%' END)) OR (@State = 'ALL' OR @State IN (SELECT Value FROM dbo.FnSplit(@State, ','))) OR ( (@LicenseStatus = 'ALL' OR @LicenseStatus IN (SELECT Value FROM dbo.FnSplit(@LicenseStatus, ','))) AND (@RenewalNotAllowed = 'ALL' OR @RenewalNotAllowed IN (SELECT Value FROM dbo.FnSplit(@RenewalNotAllowed, ','))) )
这就导致:只要Adjustername条件匹配、或者State设为'ALL'、或者LicenseStatus+RenewalNotAllowed条件同时满足,记录就会被选中。当你设置State为'ALL'时,第二个OR条件直接成立,完全绕过了RenewalNotAllowed的筛选规则,所以'Y'的记录也会被拉出来。
修正后的存储过程代码
你需要把每个参数的筛选逻辑独立封装成「参数为ALL/NULL则放行,否则筛选对应值」的条件,再用AND连接所有条件,确保四个筛选规则同时生效:
ALTER PROCEDURE [adjuster].[rpt_HIIGAdjusterLicense] @Adjustername varchar (max), @State char (3), @LicenseStatus char (3), @RenewalNotAllowed varchar (5) AS BEGIN SELECT FirstName +' '+ LastName as AdjusterName, StateLicense, LicenseNumber, LicenseStatus, ExpirationDate, RenewalNotAllowed, NPN FROM adjuster.vw_HIIGAdjusterLicense WHERE -- Adjustername筛选:参数为NULL则匹配所有,否则模糊匹配开头 (@Adjustername IS NULL OR FirstName LIKE @Adjustername + '%') -- State筛选:参数为ALL则匹配所有,否则匹配拆分后的列表 AND (@State = 'ALL' OR StateLicense IN (SELECT Value FROM dbo.FnSplit(@State, ','))) -- LicenseStatus筛选:规则同上 AND (@LicenseStatus = 'ALL' OR LicenseStatus IN (SELECT Value FROM dbo.FnSplit(@LicenseStatus, ','))) -- RenewalNotAllowed筛选:规则同上 AND (@RenewalNotAllowed = 'ALL' OR RenewalNotAllowed IN (SELECT Value FROM dbo.FnSplit(@RenewalNotAllowed, ','))) END GO
修正逻辑说明
修改后,四个筛选条件必须同时满足:
- 当
Adjustername为NULL时,匹配所有调整师姓名 - 当
State为'ALL'时,匹配所有州的记录 - 当
LicenseStatus为'ALL'时,匹配所有执照状态 - 当
RenewalNotAllowed为'N'时,仅保留该字段值为'N'的记录
这样就能精准实现你预期的筛选效果,不会再出现不符合条件的记录。
内容的提问来源于stack exchange,提问作者ETL - BI




