是否可以(如果是 - 如何)从已发布到ReportServer的SSRS数据集中检索数据?
我有Azure报告服务设置,并发布了一个DataSource,DataSet和一个完全正常工作的报告。
我想要的是 - 能够访问“已发布的DataSet” - 就像某种XML API一样? 比如使用来自浏览器的params访问某个URL,并使用该DataSet中的Data获取XML结果
答案 0 :(得分:2)
您将遇到的问题是rsd(datasetFile)本身并不是一个查询,因此发布ReportService2010的代理服务将获取数据,但您仍然需要处理XML碎化。通过直接查询SQL中的“ReportServer”IMHO,从数据集中获取数据要容易得多。而不是从代理类中创建模型,从调用这些类获取数据,然后你有xml,你仍然需要查询来获取你的数据。
带有警告字的示例:(这可能仅适用于我的数据集示例而非其他目录项):
use ReportServer
GO
Select
Path
, Name
, Content
, cast( cast(Content as varbinary(max)) as xml) as ContentAsXML
, cast(
cast(Content as varbinary(max))
as xml)
.query('declare namespace a="http://schemas.microsoft.com/sqlserver/reporting/2010/01/shareddatasetdefinition";
/a:SharedDataSet/a:DataSet/a:Query/a:CommandText')
.value('.', 'varchar(max)') as QueryStatement
from dbo.Catalog
where type = 8
基于这个人的写作:
http://bretstateham.com/extracting-ssrs-report-rdl-xml-from-the-reportserver-database/
如果您决定必须使用代理类,则必须记住调用命名空间,并使用C#执行Xdocument方法以获取数据。没有数据集,但我做了数据源,这将是一个类似的方法。您主要在foreach循环中为所需的每个数据集执行此方法。请记住,2008年或2005年你的NAMESPACE会有所不同:
private List<string> GetDataSourceRefs(string aSourceLocation)
{
var xdoc = XDocument.Load(aSourceLocation);
// Need a namespace or else the xml elements will not be properly identified. Default below is for 2012 ONLY.
XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition");
return xdoc.Descendants(ns + "DataSource")
.Elements(ns + "DataSourceReference")
.Select(x => x.Value)
.ToList();
}
答案 1 :(得分:0)
使用ReportExecution2005代理类 - 您可以执行报告并以XML格式获取它。我不确定,但我认为你也应该能够执行数据集。你可以在这里阅读更多相关信息:
Generate reports programmatically using the TFS API and SSRS