如何获取报表以查看共享数据源



我运行的是2008 R2

我有一整套报告要加载到RS中,这些是由第三方开发并发送给我们公司的。它们连接到共享数据源。我把报告上传到按功能分类的文件夹里。问题是他们看不到编写报告要使用的数据源。我创建了一个共享数据源,并将报告指向它。连接测试成功,但当我运行报告时,我继续收到以下错误:

"报表服务器无法处理报表或共享数据集。用于报表服务器或SharePoint的共享数据源'dsMyObject'无效。浏览到服务器或站点并选择共享数据源。(rsInvalidDataReference)"

当我在嵌入式数据源中使用完全相同的凭据时,报告运行,在我让它运行后,我可以将它更改回我创建的共享数据源,它运行得很好。

我的问题是这个过程效率太低,我有很多报告,还有更多的服务器来滚动它,为了让它工作,不得不手动来回切换数据源。

我注意到,当我查看数据源列表时,我看到我用第一行DS的名称创建的数据源和下一行的位置(http://[Server]/reports/[数据源文件夹]),而供应商创建的DS在两行上都有DS的名称。这使我相信,有一种方法可以将DS加载到具有供应商使用的相同名称的SSRS中,从而允许报表自动使用它们。我找不到任何东西告诉我怎么做,所以我在这里问这个问题。如何获得预编写的报表,以便在部署报表的服务器上查看共享数据源?

提前感谢,

我知道这是一个非常古老的问题,但我遇到了这个,因为我在过去的两天里面临着一个类似的问题。然而,根据我的经验,解决方案更简单——所以我将添加它,以防将来有人搜索它。

在将报告部署到RS之前,您需要创建数据源

1)在添加数据源之前,我首先部署了它们,它们不能工作:既不能从我正在处理的应用程序中工作,也不能从RS

中工作。

2)然后我创建了一个数据源,但这对现有的报告没有任何作用。我能够配置其中的一些,并将它们指向新的数据源,这是有效的。如果您想批量完成此操作,您可以使用上面建议的RS实用程序或类似的工具,但我还没有尝试过这些。

3)我尝试将报告重新部署到RS中,但显然RS不会覆盖未更改的项目,因为重新部署的报告仍然没有拾取数据源

4)然后我删除了现有的报告并重新部署-这修复了它,他们立即拿起数据源。

这是SSRS的一大缺点。在SSRS中创建报表和数据源时,会在ReportServer数据库中为它们分配唯一标识符。上传报表时,它们无法识别与构建报表时使用的名称相同的现有数据源。

解决这个问题的一种方法是使用SSRS附带的rs.exe实用程序。它可用于批量任务,包括在报表上设置数据源元数据。有关更多技术信息,请参阅下面的链接。

RS Utility

我发现解决这个问题最简单的方法是简单地创建一个使用共享数据源的新报告。在SSRS2012/VS2010中,向导的第一页询问是否使用"共享数据源"或创建"新数据源"。采用第一个选项(并继续创建虚拟报告并保存它)会产生一个RDL,其中包含在部分和部分之间的部分,如下所示:

  <DataSources>
    <DataSource Name="shared_datasource_name">
      <DataSourceReference>shared_datasource_name</DataSourceReference>
      <rd:SecurityType>None</rd:SecurityType>
      <rd:DataSourceID>f00b5045-1a8c-44be-952b-cca1ce9c57d6</rd:DataSourceID>
    </DataSource>
  </DataSources>

我只是复制粘贴这一节到我的预期报告RDL在相同的位置。它在预览期间和重新部署时愉快地使用该数据源。

使用共享数据源手动更新一个报告。在[ReportServer].[dbo].[DataSource]表中,注意该报告的"Link"值,然后只需更新在Name

中具有Datasource的重置。
update [ReportServer].[dbo].[DataSource]
set Link = '01B758F2-B597-43BE-A90F-416DF3CDA396'
where Name = 'PNLDS'
and Link is NULL

在我的例子中,我必须在SSRS中单击报告右侧的下拉箭头,选择"管理",然后选择"数据源",然后浏览到报告需要使用的共享数据源的位置

欣赏一个旧线程,但我试图找到SSRS是否可以报告它正在使用的共享数据源,所以我可以在SSRS报告中添加警告,以防它在部署时仍然指向错误的数据源。无可否认,我提出的解决方案只适用于如果你使用不同的服务器Dev/UAT/Prod,但你可以把@@SERVERNAME粘在你的tsql脚本。

我已经把它变成了一个case语句,我可以把它放在我的报告中

select case @@SERVERNAME when 'Prodserver' then '' 
else 'WARNING: This report is not looking at production data!' end as ServerWarning

对我来说足够好了!

绝对是SSRS的一大缺点。这里发布了许多适合不同场景、技能和工具的好答案。我在Powershell上使用Sys.Net.WebServiceProxy类添加另一个:

# Create WebServiceproxy object
[string] $WebServiceUri="http://localhost/ReportServer/ReportService2010.asmx?wsdl"
$proxy=New-WebServiceProxy -uri $WebServiceUri -UseDefaultCredentails
# Define required data types (DataSource and DataSourceReference) and instantiate
$typeds=($proxy.gettype().namespace) + '.DataSource'
$ds=new-object -TypeName $typeds
$typedsref=($proxy.gettype().namespace) + '.DataSourceReference'
$reference=new-object -TypeName $typedsref
# Set data source object with reference and name
$reference.Reference="/Data Sources/DStest" # path/name of the data source
$ds.Item=$reference
$ds.Name="DStest" # name of the data source on the report
# Repoint data source on report
$ReportPath="/Reports/TestReport" # path/name of the report
$proxy.SetItemDataSources($ReportPath, $ds)

解释:

主要思想是利用类Sys.Net.WebServiceProxy中的方法SetItemDataSources(x, y)来设置报告x上的数据源y.name,以指向数据源引用y.item。在我们的例子中,报告名为TestReport,位于"/Reports"文件夹中,该文件夹以"DSTest"的名称引用数据源"/data Sources/DSTest"。为了进行重点,我们需要创建对数据源($ds)的引用,我们首先需要通过从WebServiceProxy对象($proxy)的名称空间派生数据类型DataSource和DataSourceReference来定义它们

我能够批量更新并通过使用下面的T-SQL更新数据源链接来修复问题。

begin tran
update dbo.DataSource
set Link = c.ItemID 
from dbo.DataSource ds 
inner join dbo.Catalog c
on ds.Name = c.Name
and c.Type = 5
where ds.link is null
select ds.Link oldlink, c.ItemID 
from dbo.DataSource ds 
inner join dbo.Catalog c
on ds.Name = c.Name
and c.Type = 5
--where ds.link is null

select *
from dbo.DataSource ds 
where ds.link is null
rollback tran
-- commit tran 
http://tsqlblog.blogspot.co.uk/2011/05/rsinvaliddatasourcereference-on.html

最新更新