【问题标题】:Can PowerShell script out SQL Server Reporting Services RDL files?PowerShell 可以编写 SQL Server Reporting Services RDL 文件的脚本吗?
【发布时间】:2010-09-29 09:34:54
【问题描述】:

是否可以使用 PowerShell 在 SQL Server 2008 中编写 SQL Server Reporting Services rdl 文件的脚本?如果是这样,有人可以提供这样做的代码示例吗?这将是使用 3rd 方工具编写由我的商业智能部门之外的业务用户创建的 RDL 文件脚本的有用替代品。

澄清“脚本输出”一词

“脚本输出”是指我想为服务器上的每个报告自动生成底层 RDL 文件。例如,当您在 BIDS 中编写报告代码时,您正在生成一个 RDL 文件。当您将文件部署到服务器时,该文件以某种方式导入到 SQL Server ReportServer 数据库中,并且不再是单独的物理 RDL 文件。我想以 RDL 文件格式从服务器中提取所有报告。

我使用 RSScripter 工具将报告提取为 RDL 文件,因此我知道可以使用 PowerShell 以外的工具。我特别想知道是否可以使用 PowerShell 来执行此操作,如果可以,请获取执行此操作的代码示例。

澄清我为什么要生成 RDL 版本的报告

为什么将报告“脚本化”为 RDL 文件很重要?我想每晚一次将 RDL 文件签入我的源代码控制系统,以跟踪由我的商业智能部门以外的用户创建的所有报告。自从我们在 BIDS 中开发报告以来,我已经跟踪了我的部门生成的所有报告,但是我无法跟踪在线 Report Builder 工具中构建的报告的版本控制历史。

澄清为什么选择 POWERSHELL 而不是其他东西

  1. 好奇心。我有一个问题,我知道可以通过两种方法(API 或 RSSCripter)之一解决,我想知道是否可以通过第三种方法解决。

  2. 有机会通过 PowerShell 扩展我的问题解决工具。使用 PowerShell 解决这个问题可能会为学习如何使用 PowerShell 解决我尚未尝试解决的其他问题提供基础。

  3. PowerShell 对我和我的团队来说更容易理解。一般来说,我和我的团队成员可以比 .NET 代码更容易理解 PowerShell 代码。虽然我知道这个问题可以通过使用 API 的一些 .NET 代码来解决(毕竟 RSScripter 就是这样工作的),但我觉得我们编写和维护 PowerShell 脚本会更容易。我还意识到 PowerShell 脚本可能会使用 .NET 代码,但我希望 PowerShell 已经能够以某种方式将报告视为对象,因此我不必使用 Reporting Services API 来提取文件。

  4. RSScripter 还不支持 2008。过去,我使用 RSScript 编写报告脚本。不幸的是,它似乎还不支持 2008。这意味着我现在必须针对 API 编写代码,因为这是我目前知道如何以自动无人值守方式提取文件的唯一方法。

【问题讨论】:

  • 能否请您澄清一下“脚本输出”是什么意思?
  • 感谢您的反馈。我已经更新了这个问题,让其他人更清楚。

标签: powershell reporting-services reporting service


【解决方案1】:

有点晚了,你去吧

这个 PowerShell 脚本: 1. 连接到您的报表服务器 2. 创建与报表服务器相同的文件夹结构 3. 将所有 SSRS 报告定义 (RDL) 文件下载到各自的文件夹中

https://sqlbelle.wordpress.com/2011/03/28/how-to-download-all-your-ssrs-report-definitions-rdl-files-using-powershell/

【讨论】:

  • 谢谢!这真的很酷。我通过编写目录中的内容来解决这个问题,但这完全满足了我的需求。 :)
  • 不知道为什么,但这会为我返回一个Method invocation failed because [SSRS.ReportingService2005.ReportExecutionService] doesn't contain a method named 'ListChildren'.。似乎不存在类似的方法。
【解决方案2】:

我刚刚意识到 ReportServer.dbo.Catalog 中的 Content 列包含 Image 格式的定义。我编写了以下代码将其转换为可读文本:

SELECT CONVERT(VARCHAR(MAX), CONVERT(NVARCHAR(MAX), CONVERT(XML, CONVERT(VARBINARY(MAX), Content))))
FROM [ReportServer].[dbo].[Catalog]
WHERE Type = 2

使用上面的代码,我现在可以自动将结果写入一个平面文件,然后将该文件导入我的版本控制系统。

【讨论】:

    【解决方案3】:

    PowerShell 不为此提供任何原生的 PowerShell 式功能,不。您可以在 PowerShell 中执行此操作(如上一个答案中所述),只是因为 PowerShell 可以访问底层框架类。正如您在对上一个答案的评论中指出的那样,这与在 C# 或 VB 中使用 API 没有什么不同。

    SQL Server 团队尚未提供太多特定于 PowerShell 的东西。他们主要依赖 .NET 和 T-SQL 作为“脚本语言”。

    【讨论】:

    • 令人失望,如果其他人尚未提交此请求,我将在 microsoft connect 站点上提交增强请求。
    • 这对 MS 来说是一个艰难的决定。 SQL 团队已经必须支持 2-3 个 API;我敢肯定,PSH 似乎只是另外一种。我希望社区可以围绕现有的 API 包装一些 cmdlet。那就太好了。
    【解决方案4】:

    任何支持 .Net 的东西都可以做到这一点。有关 API 文档的一些链接,请参阅 this Stackoverflow posting。这个过程实际上相当简单——API 调用上传或下载 .rdl 文件。

    报表模型有点复杂。如果您上传新的报告模型,您必须获取相关报告(再次调用 API)并重新连接数据源。再说一遍,不是很费劲。

    Powershell 应该可以做到这一点。我已经用 IronPython 和 C# 做了各种不同的事情。还有一个名为 rs.exe 的工具,它接受一个 vb.net 脚本,在它的顶部和尾部添加一些包含,然后在后台编译和运行它。

    【讨论】:

    • 感谢您的反馈。出于各种原因,我正在寻找特定于 PowerShell 的答案。如果 PowerShell 尚未以某种方式将报告视为对象,那么我可能会使用 API 来导出报告。
    • Powershell 可以使用任何 .net API。无论是从 Powershell 还是任何其他 .net 语言中使用,API 都是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多