0

我在 Report Builder 中创建了一个报告(称为主要)和一个钻取(称为次要)。其中每一个都有一个 SQL 语句。

在 SQL Server Management Studio 中执行时,SQL 语句按预期工作。

但是,当 Primary.rdl 和 Secondary.rdl 上传到 Report Manager(Internet Explorer 中的 Web 界面)时,它们在运行时不会生成正确的数据。

因此,我认为问题不在于 SQL 语句。我认为这与报告管理器有关。

主 SQL 语句:

该语句从多个表中获取一堆用户数据并检查他们的密码是否可以接受。它会填充密码未通过检查的用户列表。

This is pseudocode so pardon inconsistencies in var names

with details as (
select u.userid
     , u.password
     , u.firstname
     , u.lastname
     , u.userdescription
     , u.status
     , u.lastlog
     , dbo.IsPassswordAcceptable(u.userid, u.password) as passStatus
  from masterListOfUsers as u
)
select d.*, p.datavalue
  from details as d
 left join passwordDetailList as p
    on p.keyvalue = d.passStatus
   and p.datatype = 'ERRORMESSAGE'
 where d.passStatus <> 1 
   and d.passStatus <> -5 
   and d.status = (@USERSTATUS) -- only user ids in use
     ;

辅助 SQL 语句:

此语句是一个钻取。运行报告的人可以单击上面列表中的用户 ID。在填充该用户 ID 的联系信息的地方执行钻取。

This is pseudocode so pardon inconsistencies in var names

   SELECT 
      m.userid 
    , c.address
    , c.city 
    , c.state 
    , c.zip 
    , c.cphone 
 FROM userMasterList AS m
left join userDetailList AS d 
   ON d.userid = m.userid 
left join anotherList as e on d.fullkey = e.fullkey 
left join yetAnotherList AS c 
WHERE m.userid = @USERID;

预期结果:

当用户运行主节点时,会填充密码错误的用户列表。可以单击每个用户的用户 ID,这会触发辅助节点填充与该用户 ID 关联的位置/联系信息。

实际结果:

单击用户 ID 时,辅助节点无法填充与用户 ID 关联的任何位置/联系信息。这只是偶尔发生。其他时候,它工作正常。

我列出了这些“空”用户 ID,并在 Management Studio 中运行了辅助节点的 SQL 语句,它填充了所有预期的位置/联系信息。

我尝试过的解决方案:

我完全被难住了。我对 SQL 语句进行了三次检查,并在 Management Studio 中对其进行了测试。我已将两个 .rdl 文件重新上传到报告管理器。我已通过报表管理器中的“创建链接报表”选项以及报表生成器的操作 > 转到报表选项中的“创建链接报表”选项将辅助节点重新分配给主节点。

我还可以做些什么?

4

2 回答 2

2

这并不是一个真正的答案,而是我在相同情况下会处理的事情的清单。

  1. 运行 SQL Profiler 以跟踪您的报告会话并确保正在执行的查询是您所期望的。根据参数传递给 SQL 语句的方式,SSRS 不会总是按照您预期的方式做事。

  2. 检查您是否可以通过单独运行钻取报告来重复该问题(而不是通过主报告)

  3. 确定问题是否与特定用户标识一致?即用户A总是失败而用户B总是工作吗?如果问题是一致的,则问题很可能与数据相关。检查显示为空白的字段中的特殊字符,例如 chr(13)/chr(10),它们可能只是将“真实”内容强制到文本框内的新行上。

  4. 在您的报告中添加一些调试信息以帮助识别问题,例如:

    一种。编辑数据集查询以从数据集本身添加更多信息SELECT .... , c.addrees, len(c.address) as AddresLen from .... 您可以将其添加到报告的副本中

    湾。添加另一个执行相同操作但直接在 SSRS 中的文本框(例如,表达式类似于=LEN(Fields!address.Value))。然后,您有两个数字可以与您所看到的进行比较。如果 LEN 文本框显示 20 但地址字段显示为空白,则可能是特殊字符的问题。

于 2020-01-15T13:57:50.927 回答
0

经过几个小时的修修补补,问题最终是一些查询工具正在修剪 userID 的所有前导和尾随空格,而不是 SQL 语句本身。所以当最终报表在报表管理器中运行时,查询数据时会使用多余的空格,导致找不到数据。

修剪数据点后,此问题得到解决。

固定的辅助 SQL 语句:

这是伪代码,所以请原谅 var 名称中的不一致

SELECT 
      rtrim(m.userid) as userid 
    , rtrim(c.address) as address
    , rtrim(c.city) as city 
    , rtrim(c.state) as state
    , rtrim(c.zip) as zip 
    , rtrim(c.phone) as phone 
FROM userMasterList AS m
left join userDetailList AS d 
  ON d.userid = m.userid 
left join anotherList as e on d.fullkey = e.fullkey 
left join yetAnotherList AS c 
WHERE ltrim(rtrim(m.userid)) = ltrim(rtrim(@USERID));
于 2020-01-15T18:50:35.357 回答