执行SSRS查询返回空白结果的技术问询
排查SSRS报表空白无数据的问题
我来帮你梳理下这个SSRS报表返回空白的可能原因,从查询语法、关联逻辑到参数配置逐一分析:
1. 首先修正查询中的语法错误
你的查询语句里存在多余的逗号,这会直接导致SQL执行失败,自然无法返回任何数据:
ContactName, ,tblDataPermit.XmlDataField.value(...) AS ConPhone此处多了一个逗号Grp, ,tblDataPermit.XmlDataField.value(...) AS A此处也多了一个逗号
修正后的完整查询:
SELECT tblDataPermit.ApplicationNumber , tblDataParcel.StreetNum , tblDataParcel.StreetName , tblDataPermit.Applicant , tblDataPermit.Status , tblDataPermit.XmlDataField.value('(//*[local-name()="Text4Size10"])[1]', 'nvarchar(max)') AS Cycle , tblDataPermit.ApplicantPhone AS BusPhone , tblDataPermit.XmlDataField.value('(//*[local-name()="Text2Size50"])[1]', 'nvarchar(max)') AS ContactName, tblDataPermit.XmlDataField.value('(//*[local-name()="Text1Size10"])[1]', 'nvarchar(max)') AS ConPhone , tblDataPermit.ApplicationType AS Grp, tblDataPermit.XmlDataField.value('(//*[local-name()="ExtraYesNo1"])[1]', 'nvarchar(max)') AS A , tblDataPermit.XmlDataField.value('(//*[local-name()="ExtraYesNo2"])[1]', 'nvarchar(max)') AS E , tblDataPermit.XmlDataField.value('(//*[local-name()="ExtraYesNo3"])[1]', 'nvarchar(max)') AS F , tblDataPermit.XmlDataField.value('(//*[local-name()="YesNo3"])[1]', 'nvarchar(max)') AS S , ExpirationDates.ExpirationDate AS Due , IStatuss.Status AS ADate , MaxCompletionDates.MaxCompletionDate , SysCod.CodRcdTyp , SysCod.CodLabel , SysCod.CodOrder FROM SysCod INNER JOIN tblDataPermit ON SysCod.CodOrder = tblDataPermit.Type INNER JOIN tblDataParcel ON tblDataPermit.ParcelID = tblDataParcel.ParcelID LEFT OUTER JOIN ( SELECT ProjectNumber, ExpirationDate FROM tblDataPermit AS tblDataPermit_2 WHERE (Type = '54') ) AS ExpirationDates ON tblDataPermit.ApplicationNumber = ExpirationDates.ProjectNumber INNER JOIN ( SELECT ProjectNumber, Status FROM tblDataPermit AS tblDataPermit_3 WHERE (Type = '54') ) AS IStatuss ON tblDataPermit.ProjectNumber = IStatuss.ProjectNumber LEFT OUTER JOIN ( SELECT MAX(tblDataActions.CompletionDate) AS MaxCompletionDate, tblDataPermit_1.Type, tblDataPermit_1.ProjectNumber FROM tblDataActions INNER JOIN tblDataPermit AS tblDataPermit_1 ON tblDataActions.ApplicationNumber = tblDataPermit_1.ApplicationNumber GROUP BY tblDataPermit_1.Type, tblDataPermit_1.ProjectNumber HAVING (tblDataPermit_1.Type = '54') ) AS MaxCompletionDates ON tblDataPermit.ApplicationNumber = MaxCompletionDates.ProjectNumber WHERE (tblDataPermit.Type = '72') AND CodLabel IN (@AppStatus) AND XmlDataField.value('(//*[local-name()="Text4Size10"])[1]', 'nvarchar(max)') IN (@Cycle)
2. 关联逻辑可能过滤掉所有数据
- INNER JOIN SysCod:如果
SysCod表中没有与tblDataPermit.Type='72'匹配的CodOrder记录,INNER JOIN会直接过滤掉所有主表数据。可以改为LEFT JOIN SysCod保留主表数据,或者先确认SysCod中存在Type=72对应的记录。 - INNER JOIN IStatuss:这个子查询筛选的是
Type='54'的记录,而主查询目标是tblDataPermit.Type='72',如果Type=72的记录没有对应的Type=54的ProjectNumber,INNER JOIN会过滤掉这些行。建议改成LEFT JOIN IStatuss,除非你确认所有Type=72的记录都有匹配的Type=54数据。
3. XML字段取值与参数匹配问题
- 先单独验证XML字段的取值是否正确:在SSMS中执行以下语句,确认是否返回预期的Cycle值:
SELECT XmlDataField.value('(//*[local-name()="Text4Size10"])[1]', 'nvarchar(max)') AS Cycle FROM tblDataPermit WHERE Type='72' - 检查
@Cycle参数配置:确保参数包含上述查询返回的Cycle值,且参数类型与XML返回的nvarchar类型匹配;如果是多值参数,确认SSRS参数设置中“允许多值”已勾选。
4. SSRS参数与配置验证
- 先在SSMS中直接执行查询(替换
@AppStatus和@Cycle为具体值,比如CodLabel IN ('Approved')、Cycle IN ('2024')):- 如果SSMS能查到预期的200行数据,说明问题在SSRS端,比如参数默认值为空、参数未正确映射到数据集;
- 如果SSMS也查不到数据,那就是查询逻辑的问题,回到前面的关联和条件排查。
内容的提问来源于stack exchange,提问作者Bill R
相关产品推荐
相关产品推荐

