Я пытаюсь выбрать из таблицы, содержащей столбец XML. Я хотел бы получить конкретный узел и создать строку для каждого.
XML напрямую получен из базы данных служб Reporting Services и содержит структуру RDL (отчет). Моя цель - отобразить все значения ‹Textbox›‹Value›example‹/Value›‹/Textbox›
для каждого отчета. Расположение ‹Textbox›
узлов непредсказуемо (оно может быть частью любого элемента где-либо в структуре XML).
Ниже приведен текущий код, но по какой-то причине id не работает:
<code>
IF object_id('tempdb..#c') IS NOT NULL
DROP TABLE #c
select top 50
path as reportpath
,name as reportname
,convert(xml, convert(varbinary(max), content)) as reportxml
into
#c
from
reportserver.dbo.catalog
where
content is not null
order by creationdate desc
-----------------------------------------
DECLARE @x XML
SELECT @x =
( SELECT
[reportpath]
,[reportname]
,[reportxml].query('
for $a in //../Textbox
return ‹Textbox
valueX="{$a/Value}"
/›
')
FROM #c AS reports
FOR XML AUTO
)
select @x
-----------------------------------------
SELECT [reportpath] = T.Item.value('../@reportpath', 'nvarchar(max)'),
[reportname] = T.Item.value('../@reportname', 'nvarchar(max)'),
value = T.Item.value('@value' , 'nvarchar(max)')
FROM @x.nodes('//reports/Textbox') AS T(Item)
</code>
Пример ниже показывает образец «Textbox», связанного с «Value»:
‹RowGrouping›
‹Width›2.53968cm‹/Width›
‹DynamicRows›
‹Grouping Name="matrix1_OperationalWeek2"›
‹GroupExpressions›
‹GroupExpression›=Fields!OperationalWeek.Value‹/GroupExpression›
‹/GroupExpressions›
‹/Grouping›
‹ReportItems›
‹Textbox Name="textbox35"›
‹rd:DefaultName›textbox35‹/rd:DefaultName›
‹Style›
‹BackgroundColor›White‹/BackgroundColor›
‹PaddingLeft›2pt‹/PaddingLeft›
‹PaddingRight›2pt‹/PaddingRight›
‹PaddingTop›2pt‹/PaddingTop›
‹PaddingBottom›2pt‹/PaddingBottom›
‹/Style›
‹ZIndex›8‹/ZIndex›
‹Value›=Fields!OperationalWeek.Value‹/Value›
‹/Textbox›
‹/ReportItems›
‹/DynamicRows›
‹/RowGrouping›
PS У меня возникли проблемы с форматированием кода в стеке, поэтому я заменил метки <и> на ‹и›. Извини за это.