求助:SSRS Report Manager无法返回预期存储过程数据集结果
以下是针对该问题的排查和解决步骤:
核对执行上下文差异
Report Builder通常使用当前登录用户的凭据执行(即使数据源配置了共享凭据,本地运行可能走Windows身份模拟),而Report Manager运行时依赖SSRS服务账号或数据源指定的专用凭据。先确认两者实际执行存储过程的账号是否完全一致:可以在数据集里添加SELECT SYSTEM_USER查询,分别在两种环境下运行,对比返回的账号。另外,检查存储过程是否依赖会话级设置(如SET DATEFORMAT、SET LANGUAGE),不同环境的会话参数差异可能导致逻辑分支返回空结果。深度排查权限(不限于EXECUTE)
即便DBA认为无需VIEW DEFINITION权限,也要确认存储过程内部是否依赖需要额外权限的对象:比如使用动态SQL、访问系统视图(如sys.tables)、调用其他有权限要求的存储过程。可以执行以下SQL查询存储过程的权限关联:SELECT dp.NAME AS principal_name, dp.type_desc AS principal_type, o.NAME AS object_name, p.permission_name FROM sys.database_permissions p JOIN sys.objects o ON p.major_id = o.object_id JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id WHERE o.NAME = '你的存储过程名称';也可临时给SSRS服务账号添加
VIEW DEFINITION权限测试,若问题解决,说明存储过程内部确实需要该权限,再和DBA沟通具体依赖场景。检查执行计划与缓存
Report Manager可能缓存了旧的执行计划,导致返回空结果。可在数据库执行DBCC FREEPROCCACHE (你的存储过程缓存ID)清除特定缓存,或重启SSRS服务刷新缓存。另外,对比两种环境的执行计划:在Report Builder运行时捕获执行计划,Report Manager运行后查看数据库的执行计划缓存,排查是否因参数嗅探导致执行计划选择错误,进而返回空结果。验证数据源配置细节
确认Report Manager中数据源的凭据是否正确保存:有时配置共享数据源时,凭据未正确加密存储,导致实际执行时使用匿名或错误账号,可重新输入凭据并保存测试。同时检查数据源的模拟设置,若使用Windows身份验证,确认SSRS服务账号是否具备委托权限,排查是否存在Kerberos双重跳问题导致无法正常访问数据库。
结果对比截图
Report Builder 数据集结果

SSRS Report Manager 数据集结果

内容的提问来源于stack exchange,提问作者Andrew Phommathep

