簡體   English   中英

如何將非表數據導入SQL Server Reporting Services?

[英]How do I get non-Table data into SQL Server Reporting Services?

給定:AC#計算引擎加載對象模型,壓縮大量數字,並將結果保存到SQL Server中的幾個巨大的索引數據庫表中。 這些表為Web界面,其他軟件模塊和SQL Server Reporting Services 2005報告提供數據。

我設法使發動機在軟件的最新版本快了很多 ,速度不夠快,現在,它可以要求提供數據-有時甚至比它需要在數據庫中查詢預先計算的數字的時間更快。 我對此感到非常高興。

這一突破意味着我們可以根據Web界面和其他軟件模塊的請求生成數據。 但是緩存表還不會死,因為它們被SSRS報告(或者更具體地說,通過查詢表並將數據提供給SSRS的存儲過程)使用。

緩存表很痛苦,就像任何緩存都是軟件世界的痛苦一樣。 沒有太多的細節,他們有同步問題,鎖定問題等等。如果我不必擔心保持這些darned表更新,軟件將更好地工作。

但我怎樣才能將數據導入SSRS? 我做了很多研究,沒有什么看起來太有希望了:

  • 我們可以通過Web服務提供數據並使用SSRS XML DPE。 但這看起來有點可怕 - 我是對的,你必須自己解析你的SOAP信封嗎?! 它不支持XPath,而是一種專有的XPath-y方言? 我們的報告編寫者了解T-SQL,這就是他們最擅長的。
  • 使用SQL CLR來托管我們的API是不可取的 - 它是一個很大的應用程序,如果不創建應用程序對象並登錄等,你就無法做任何事情。
  • 使用SQL CLR聯系Web應用程序上的Web服務 - 這是迄今為止最有希望的(本文有用http://www.simple-talk.com/sql/sql-server-2005/practical-sql- server-2005-clr-assemblies / 。)有沒有人嘗試過這種方法? 它是否運行良好,是否可以提供大型數據集? OTOH我被客戶端數據庫服務器上的額外設置關閉了。
  • 任何其他建議將不勝感激。

如果我理解正確,那么您正在構建有關非SQL數據的報告。 您將數據存儲在表中,以實現使其可報告的特定目的。

我能想到兩個解決方案。 第一種是使用報告部分擴展您的C#計算引擎。 Microsoft.Reporting.WinForms和Microsoft.Reporting.WebForms命名空間可用於在任何數據源上構建報告,而不僅僅是SQL Server。 如果最終用戶將您的應用用作客戶端,則可以即時生成數據和報告。

第二種是使用SQL CLR。 您可以使用CLR存儲過程作為報告的基礎(輸入“exec mysp”作為數據源。)此CLR過程是C#代碼,可以將您的計算引擎包含為庫。 這樣您就可以動態生成報告,同時仍然使用Report Server用戶界面。

有趣的問題,我希望更有知識的人能提供更好的答案:)

我之前遇到過類似情況,並嘗試過SSRS XML數據源和Andomar提到的報告擴展。 我的建議是使用SSRS XML數據源功能。 如果Web服務返回的數據結構很簡單,那么XPath也很簡單。 我還發現它更容易調試。 需要注意的主要是超時。

使用Web服務的好處在於它們很容易被許多不同的技術所使用,因此無論如何它們都可以變得非常方便。

此外,這是個人選擇,但盡管有SQL CLR功能,我仍然覺得將代碼放入數據庫感覺不舒服。 通過在SSRS中使用XML數據源,根本不需要涉及自定義CLR代碼。

您可以將數據包裝在ADO.NET DataSet中,並將其用作Reporting Services數據源。

我從來沒有親自使用過這個,所以我不能給你更多的信息。 但是,我知道你可以從我參加的SSRS課程中做到這一點。 教師在“真實世界”示例中執行此操作時給出的示例是,如果您需要連接來自兩個不同數據源的數據。 例如,如果要在一個報表中將SQL Server和Oracle中的數據關聯在一起,則可以執行此操作。

我知道這不是你想要做的,但聽起來它會提供你需要的同一層抽象。

您是否考慮過編寫位於計算引擎之上的自定義數據庫驅動程序? 然后,您可以將報告服務指向它。 盡管這可能是一項復雜的任務,但這會使事情變得更快。 我過去曾經考慮過我正在開發的專有數據倉庫軟件,但從來沒有開始構建驅動程序。

順便問一下很棒的問題。

使用SQL CLR聯系Web應用程序上的Web服務

這是我推薦的方式 - 我這樣做是為了通過他們的Web服務訪問SharePoint列表數據。 如果可以修復數據模式,那么SQL CLR TVF可能非常適合並且具有最大的靈活性。 如果需要在執行時確定模式,則SQL CLR存儲過程就是您想要的,因為它未綁定到模式。

您需要的關鍵是:

-- enable CLR on the server
sp_configure 'clr_enabled', 1
GO
RECONFIGURE
GO

-- allow your db to execute clr code marked EXTERNAL or UNSAFE
alter database mydb set trustworthy on

然后創建一個VS sql clr項目(您沒有必要,但它有助於部署和調試它),將權限級別設置為“外部”。 如果在VS項目中使用“添加Web引用”,則必須在生成/部署后打開序列化程序集和CREATE ASSEMBLY的生成以加載它。

現在這是一個小小的波浪形 - 老實說,我已經做到了 - 我稍后會添加一些細節。 上個月我在SQL CLR上發表了演講。 我的示例代碼包含調用Web服務(Fibonnaci)的GetFibs項目,該服務也包含在內。

另請查看: http: //footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspxhttp:// www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

它是否運行良好,是否可以提供大型數據集?

是的,它似乎表現良好。 通過一些額外的工作,您可以以更加流的方式構建它,它不會占用整個集合的內存。 請參閱Range示例或此處的說明

我絕對會走ADO.NET DPE之路 如果您的數據源可以實時提供必要的數據,那么它將是最有意義的。 您將節省1,2或3層,這肯定會提高整體性能。 而不是談論每個代碼的維護。 將數字壓縮數據公開為ADO.NET數據集,讓您的報表服務直接查詢,在我看來是最好的。

在SQL 2008中,您可以使用SQL SSIS包作為數據源。 編寫SSIS包以動態執行計算引擎並輸出內存中.net數據集(DataReaderDestination)。 然后可以將其用於報告。

暫無
暫無

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

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