【发布时间】:2018-03-23 15:48:41
【问题描述】:
我正在尝试查询 xml 格式的 SSRS .rdl 文件。以下是xml相关部分的示例:
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
<DataSources>
<DataSource Name="DataSource1">
<DataSourceReference>DataSourceReference1</DataSourceReference>
</DataSource>
<DataSource Name="DataSource2">
<DataSourceReference>DataSourceReference2</DataSourceReference>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="DataSet1">
<Query>
<DataSourceName>DataSource1</DataSourceName>
<CommandText>SELECT a from b</CommandText>
</Query>
</DataSet>
<DataSet Name="DataSet2">
<Query>
<DataSourceName>DataSource2</DataSourceName>
<CommandText>SELECT c from d</CommandText>
</Query>
</DataSet>
</DataSets>
...
到目前为止,这是我的 SQL 查询:
IF OBJECT_ID('tempdb..#catalogtemp') IS NOT NULL DROP TABLE #catalogtemp
GO
SELECT Path, CONVERT(XML, CONVERT(VARBINARY(MAX), Content)) XmlColumn
INTO #catalogtemp
FROM Catalog WHERE Type=2;
;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition' as rdl10)
SELECT Path as ReportPath,
T1.dataset.value('./@Name','nvarchar(max)') DatasetName,
T1.dataset.value('(.//rdl10:CommandText)[1]','nvarchar(max)') as DatasetQuery,
T1.dataset.value('(.//rdl10:DataSourceName)[1]','nvarchar(max)') as DataSourceName
FROM #catalogtemp
CROSS APPLY xmlColumn.nodes('//rdl10:DataSet') T1(dataset)
对于上面的示例 xml,这将返回:
ReportPath DatasetName DatasetQuery DataSourceName
/path/to/report DataSet1 SELECT a from b DataSource1
/path/to/report DataSet2 SELECT c from d DataSource2
我想做的是添加另一列,查找DataSource 节点的DataSourceReference 值,其Name 属性与DataSet 的DataSourceName 值匹配。所以查询的结果应该是这样的:
ReportPath DatasetName DatasetQuery DataSourceName DataSourceReference
/path/to/report DataSet1 SELECT a from b DataSource1 DataSourceReference1
/path/to/report DataSet2 SELECT c from d DataSource2 DataSourceReference2
我知道以下 XQuery 将为 DataSource 节点返回 DataSourceReference 值,该节点的 Name 属性为“DataSource1”:
T1.dataset.value('(../..//rdl10:DataSource[@Name="DataSource1"]//rdl10:DataSourceReference)[1]','nvarchar(max)')
但是如何编写查询以每次查找正确的DataSourceName?
【问题讨论】:
标签: sql-server reporting-services xquery sql-server-2014 xquery-sql