我有一台托管我们的生产和开发数据库的服务器。它使用SQL Server Reporting Services运行SQL Server 2008(而不是R2)。
我将VS 2008 Reporting Services项目部署到服务器以提供报告。所有报告都使用单个共享数据源,目前指向生产数据库。
其他地方的后台服务通过Web服务界面向SSRS创建PDF报告。
我的问题是,在这种环境下,是否可以通过Web服务以编程方式更改要在执行期间使用的数据源,以便报告使用dev或production数据库? / p>
我不想修改共享数据源或报表定义,我只想在执行报表之前设置数据库的名称,我看不出这是怎么回事。
我能看到的唯一“简单”解决方案是安装另一个报表服务器实例,这对我想要的东西来说似乎有些过分。除非有人给我一个狡猾的答案,否则我即将这样做!
答案 0 :(得分:8)
是的,试试这个:
将数据源定义为表达式,如下所示:
=“data source =”&参数!Server.Value& “;初始目录=”&参数!Database.Value
现在,您应该能够在运行时动态指定数据库和服务器
请记住,底层数据集定义需要在您执行报告的每个数据库和服务器中有效。
你也可以通过像这样的网址字符串传递参数:
http://server/reportserver?/dir/Report&rs:Command=Render&Server=VALUE1&Database=VALUE2
请记住,这些需要进行网址编码并记住传递值,而不是标签,如果它们不同的话。
答案 1 :(得分:4)
修改 - 另一个建议
让Visual Studio中的数据源指向开发数据库。将已部署的数据源指向生产数据库。将数据源设置为不在部署时覆盖现有数据源。这意味着VS中的所有开发都将针对开发数据库,但是当您部署报表时,它将使用先前部署的指向生产数据库的数据源。
原始建议
我们有类似的问题 - 我们有一套报告需要能够在历史财务年度的任何数据库上运行,因此用户需要能够选择运行报告的数据库。
Reporting Services的优势在于一切都是表达式,数据集的SQL也不例外。我们所做的是修改SQL以使用用户选择的数据库。
设置如下: 在公共数据库中的Sql Server上,我们创建了一个名为DatabaseLookup的表,其中包含DatabaseLabel(显示名称)和DatabaseName(数据库的实际名称)字段以及INT SortOrder,因此我们可以在创建新数据库时按顺序向后排序数据库一。 在Reporting Services中,我们创建一个指向我们的公共数据库的数据源和一个名为Databases的新数据集,该数据集使用该数据源:
SELECT DatabaseLabel, DatabaseName
FROM DatabaseLookup
ORDER BY SortOrder
设置一个名为Database的参数,它使用数据库数据集,其值字段= DatabaseName,Label字段= DatabaseLabel,未查询的默认值为我们当前的数据库。
现在我们将报表主表的SQL修改为表达式。假设我们的SQL看起来像这样:
SELECT SomeField, OtherField
FROM SomeTable
我们将其转换为计算表达式,如下所示:
="SELECT SomeField, OtherField "
&"FROM " & Parameters!Database.Value & ".dbo.SomeTable "
所选数据库的标签也以小字体包含在标题中,以便人们知道他们正在查看哪些数据。
当新的财政年度出现时,我们只需在DatabaseLookup表中添加一个新行,系统中的每个报表现在都可以使用该新数据库。
答案 2 :(得分:0)
我目前的答案(我不满意)是有2个VS 2008项目包含报告。一个用于开发报告,一个用于生产。每个都使用不同的数据源,并部署到/ Reports / Development和/ Reports / Production下的同一SSRS实例中。
在Dev项目中开发/更改报告,然后将其复制到Production,并在准备好后更改数据源名称。
我讨厌这个解决方案,但它无法通过Web服务更改执行时的数据源,因为副作用允许我在部署期间将报告放入不同的文件夹中VS项目。
我仍然不认为这是一个答案,我的躲闪0分! :)