You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动