如何将非表数据导入 SQL Server Reporting Services?

Posted

技术标签:

【中文标题】如何将非表数据导入 SQL Server Reporting Services?【英文标题】:How do I get non-Table data into SQL Server Reporting Services? 【发布时间】:2009-05-07 13:49:23 【问题描述】:

Given:一个 C# 计算引擎,它加载一个对象模型,处理大量数字,并将结果保存到 SQL Server 中的几个巨大的索引数据库表中。这些表格为 Web 界面、其他软件模块和 SQL Server Reporting Services 2005 报告提供数据。

我设法在最新版本的软件中使引擎速度提高了很多,现在它可以根据请求提供数据,速度足够快 - 有时甚至比查询预先计算的数字的数据库。我对此感到非常高兴。

这一突破意味着我们可以根据请求为 Web 界面和其他软件模块生成数据。但是缓存表还不能消亡,因为它们被 s-s-rS 报告(或者更具体地说,被查询表并向 s-s-rS 提供数据的存储过程所消耗。)

缓存表是一种痛苦,就像任何缓存在软件世界中都是一种痛苦一样。无需过多介绍,它们有同步问题、锁定问题等。如果我不必担心让那些该死的表保持最新状态,该软件会运行得更好。

但我还能如何将数据导入 s-s-rS?我进行了相当多的研究,没有什么看起来太有希望了:

我们可以通过 Web 服务提供数据并使用 s-s-rS 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 我被我们必须在客户端数据库服务器上进行的额外设置关闭了。 我们将不胜感激任何其他建议。

【问题讨论】:

我已经为任何可以为我提供良好经验/信息/规格/数字的人添加了赏金,以了解是否可以使用 SQLCLR/Web 服务实现这一目标,或者任何其他有助于解决此问题的好主意情况。 您好,我是否正确理解缓存表主要由 s-s-rS 用于报告目的?听起来报告是您的应用程序/解决方案的一个方面,但由于这个方面,它会导致为了报告的目的而完成一些令人讨厌的数据库工作? 没错,Rihan。报告是应用程序的一个组件,这些讨厌的表格的存在只是为了为报告提供数据。 看来我必须了解赏金的运作方式。我的赏金已过期并被自动授予。感谢您的所有建议,大家!正如 Alex Angas 所建议的,我们在下一个版本的软件中的第一步将是创建一个数据 Web 服务并尝试使用 XML DPE。此模块中没有那么多 报告可以替换,而且数据相当简单,因此我们将试一试。如果结果证明这是一条死胡同,我们已经有了 Web 服务,接下来可能会尝试使用 SQLCLR Web 服务调用程序。再次感谢! @BarryFandango,是的,这个问题看起来并没有最终解决。下面有很多推测性的答案。我很好奇你的最终解决方案是什么。 【参考方案1】:

如果我的理解正确,您正在构建非 SQL 数据的报告。您将数据存储在表格中的特定目的是使其可报告。

我可以想到两种解决方案。首先是使用reporting part 扩展您的C# 计算引擎。 Microsoft.Reporting.WinForms 和 Microsoft.Reporting.WebForms 命名空间可用于在任何数据源上构建报表,而不仅仅是 SQL Server。如果最终用户将您的应用用作客户端,您可以即时生成数据和报告。

二是使用SQL CLR。您可以使用 CLR 存储过程作为报告的基础(输入“exec mysp”作为数据源。)此 CLR 过程是 C# 代码,可以将计算引擎作为库包含在内。这将允许您即时生成报告,同时仍使用报告服务器用户界面。

有趣的问题,我希望更多知识渊博的人可以提供更好的答案:)

【讨论】:

报告部分非常有趣!我还没有发现。不幸的是,我们的客户依赖于 s-s-rS 功能,例如自动交付和报告计划,因此为应用报告的子集滚动我们自己的报告是行不通的。 那是否意味着你要执行 SQL CLR 呢? Gator,这意味着我必须寻求一个选项,让我从 s-s-rS 服务器呈现 s-s-rS 报告。这可能意味着 SQLCLR、SQLCLR-WebService、WebService-XMLDPE 或任何其他出现问题的想法。【参考方案2】:

我之前遇到过类似的情况,并尝试了 s-s-rS XML 数据源和 Andomar 提到的报告扩展。我的建议是使用 s-s-rS XML 数据源功能。如果 Web 服务返回的数据结构很简单,那么 XPath 也很简单。我还发现它更容易调试。需要注意的主要事情是超时。

使用网络服务的好处是它们很容易被许多不同的技术所使用,因此无论如何它们都可以变得非常方便。

此外,这是个人选择,但尽管有 SQL CLR 功能,但我仍然对将代码放入数据库感到不舒服。通过在 s-s-rS 中使用 XML 数据源,根本不需要涉及自定义 CLR 代码。

【讨论】:

+1 问题提到“使用 SQL CLR 联系 Web 应用程序上的 Web 服务”,但是使用 XML 数据源,您可以在没有 SQL CLR 的情况下联系 Web 服务。【参考方案3】:

您可以将数据包装在 ADO.NET DataSet and use it as a Reporting Services Data Source. 中。

我从来没有亲自使用过这个,所以我不能给你更多的信息。但是,我知道您可以从我参加的 s-s-rS 课程中做到这一点。当您在“现实世界”示例中执行此操作时,讲师给我的示例是如果您需要连接来自两个不同数据源的数据。例如,如果您想将 SQL Server 和 Oracle 中的数据关联到一个报表中,您可以这样做。

我知道这不是您想要做的,但听起来它会提供您需要的相同抽象层。

【讨论】:

自定义数据处理扩展绝对是本次讨论中的一个新想法。该示例描述了一个定制的 ADO.NET DPE,它从磁盘位置读取固定的 xml 文件,显然在现实世界中不太实用。我想我可以创建一个 DPE,它将一个 Web 服务 URL 作为其连接字符串,然后是一个带有参数值的方法名称作为查询 - 这听起来对吗? 我从来没有实现过这个,所以我不能从经验中给你任何实用的建议。话虽如此,这听起来像是我会采取的方法。您是否已经有要使用的 Web 服务?如果是这样,那么在 .NET Data Provider (esque) 接口后面屏蔽它的调用听起来像是要走的路。如果没有,并且您有一个 .NET 库,那么将其 API 方法挂钩可能会更好。您将避免 SOAP 之类的开销。这是我藏在脑后但从未亲自使用过的东西之一。【参考方案4】:

您是否考虑过在计算引擎之上编写自己的自定义数据库驱动程序?然后,您可以将报告服务指向它。尽管这可能是一项复杂的任务,但这将使事情保持快速。我过去曾考虑将它用于我正在开发的专有数据仓库软件,但从未着手构建驱动程序。

顺便问下好问题。

【讨论】:

克里斯,肯定是开箱即用的点,但我不确定额外的工作是否比编写自定义 s-s-rS 数据处理扩展或使用发布的 ADO.NET 自定义 DPE 有什么好处亚伦丹尼尔斯。 它提供的好处是任何可以使用 ADO.NET 数据的东西都会成为您系统的潜在使用者。例如,您可以将 Excel 电子表格直接链接到您的系统。 和 Peter 所说的一样,我敢打赌,与其他方法相比,您将受益于性能提升。【参考方案5】:

使用 SQL CLR 联系网站 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 的演讲。我的sample code 有调用 Web 服务 (Fibonnaci) 的 GetFibs 项目,该项目也包括在内。

也可以看看这里:http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspx 和 http://www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

性能好不好,能不能提供 大数据集?

是的,它似乎表现不错。通过一些额外的工作,您可以以更加面向流的方式构建它,它不会消耗整个集合的内存。请参阅 Range 示例或 here。

【讨论】:

【参考方案6】:

我肯定会选择ADO.NET DPE road。如果您的数据源可以实时提供必要的数据,那么这将是最有意义的。您将为自己节省 1,2 或 3 层,这肯定会提高整体性能。并且不谈每一层代码的维护。将经过数字处理的数据公开为 ADO.NET 数据集并让您的报告服务直接查询它,这是我认为的最佳选择。

【讨论】:

【参考方案7】:

在 SQL 2008 中,您可以使用 SQL SSIS 包作为数据源。 编写一个 SSIS 包以动态执行计算引擎并输出内存中的 .net 数据集 (DataReaderDestination)。然后可以将其用于报告。

【讨论】:

以上是关于如何将非表数据导入 SQL Server Reporting Services?的主要内容,如果未能解决你的问题,请参考以下文章

sql server如何导入数据库

sql server的数据如何导入到mysql数据库中?

如何把DB2的数据直接导入SQL server中

如何将EXCEL数据导入到SQL SERVER数据库中

如何将mysql 数据库导入到sql server 2008 数据库

sql server的数据如何导入到mysql数据库中?