簡體   English   中英

SSRS 報告管理器:鏈接報告行為異常,但 SQL 查詢工作正常

[英]SSRS Report Manager: Linked report behaving strangely but SQL queries work fine

我在 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 文件重新上傳到 Report Manager。 我已經通過報告管理器中的“創建鏈接報告”選項以及報告生成器的操作 > 轉到報告選項將輔助節點重新分配給主節點。

我還可以做些什么?

這並不是真正的答案,而是我在相同情況下會解決的問題的列表。

  1. 運行 SQL Profiler 來跟蹤您的報告會話並確保正在執行的查詢符合您的預期。 根據參數傳遞給 SQL 語句的方式,SSRS 不會總是按照您預期的方式做事。

  2. 檢查您是否可以通過單獨運行鑽取報告(而不是通過主報告)來重復該問題

  3. 確定問題是否與特定用戶 ID 一致? 即用戶 A 總是失敗而用戶 B 總是工作嗎? 如果問題一致,則問題很可能與數據相關。 檢查顯示為空白的字段中的特殊字符,例如 chr(13)/chr(10),它們可能只是將“真實”內容強制到文本框內的新行中。

  4. 在您的報告中添加一些調試信息以幫助識別問題,例如:

    一種。 編輯數據集查詢以從數據集本身添加更多信息SELECT .... , c.addrees, len(c.address) as AddresLen from ....您可以將其添加到報告的副本中

    添加另一個直接在 SSRS 中執行相同操作的文本框(例如,表達式類似於=LEN(Fields!address.Value) )。 然后,您可以將兩個數字與您所看到的進行比較。 如果 LEN 文本框顯示 20,但地址字段顯示為空白,則特殊字符可能是問題所在。

經過數小時的修補,問題最終是用戶 ID 被一些查詢工具而不是 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM