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

How can I extract multiple values from an XML column, using a function similar to value()?

我正在尝试从 SQL 服务器的报表服务器数据库中提取 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'

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

是否有另一个具有类似语法的函数可以让我 return 所有值?或者我可以使用通配符代替数字吗?我在 msdn 上尝试了多个功能,但没有成功。

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

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

没有你实际的例子 XML 很难回答但是:

尝试通过将其添加到 cross apply

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

然后将列更改为

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

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

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

顺便说一句:我不明白这个:

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

C.Parameter 的初始类型是什么,您必须将其转换为 VARCHAR(MAX),然后再转换为 XML?如果您仍在使用已弃用的 TEXTNTEXTIMAGE,您应该考虑更改它!