如何使用类似于value()的函数从XML列中提取多个值?

时间:2016-08-22 19:52:33

标签: sql-server xml tsql xpath xquery-sql

我正在尝试从SQL Server的报表服务器数据库中提取xml元数据。我目前的查询如下:

SELECT 
 a.Name as 'ReportName'
,a.ReportXML
,Parameter = x.value('(Parameter/Name)[1]','VARCHAR(250)')
FROM (SELECT C.Name,c.itemID,CONVERT(XML,CONVERT(VARCHAR(MAX),C.Parameter)) AS reportXML
      FROM ReportServer.dbo.Catalog C
      WHERE C.Content is not null
      and c.Type = 2 -- Report only
      ) a

cross apply reportXML.nodes('/Parameters') r (x)
WHERE 1=1 
and name ='ReportName'

我的目标是返回与报告相关的所有参数。 x.value方法最多只返回1个值。 (它当前返回报告的第一个参数,因为1在字符串文字中是硬编码的。)我知道我正在查看的报告有5个参数。

是否有另一个具有相似语法的函数可以让我返回所有值?或者是否有可以用来代替数字的通配符?我在msdn上尝试过多个函数而没有运气。

1 个答案:

答案 0 :(得分:1)

您的查询正在使用nodes('/Parameters')。这将为每个Parameters元素返回一行结果集 - 但只有一行可能。

使用Parameter = x.value('(Parameter/Name)[1]','VARCHAR(250)'),您正在读取第一个参数的名字。如果Parameter中嵌套了更多Parameters个元素,您将只阅读第一个...

如果没有您的实际XML示例,则不容易回答:

尝试在cross apply

下方添加一个嵌套级别
outer apply r.x.nodes('Parameter') AS p (y)

然后将列更改为

,Parameter = y.value('Name[1]','VARCHAR(250)')

这应该读取每个Name元素的第一个Parameter元素

如果您需要进一步的帮助,请提供您的XML示例。

顺便说一下:我不明白这一点:

CONVERT(XML,CONVERT(VARCHAR(MAX),C.Parameter)

C.Parameter的初始类型是什么,您必须将其投放到VARCHAR(MAX)然后投放到XML?如果您仍在使用已弃用的TEXTNTEXTIMAGE,则应考虑更改此内容!