我正在尝试从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上尝试过多个函数而没有运气。
答案 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
?如果您仍在使用已弃用的TEXT
,NTEXT
或IMAGE
,则应考虑更改此内容!