Ваш собственный код использует .nodes()
для получения производной таблицы от повторяющихся элементов. В вашем случае есть два уровня повторяющихся элементов:
- много полей и внутри каждого поля
- много предметов
Вы должны использовать .nodes()
дважды:
SELECT fld.value(N'(id/text())[1]',N'int') AS FieldID
,itm.value(N'(name/text())[1]',N'nvarchar(max)') AS ItemName
,itm.value(N'(value/text())[1]',N'nvarchar(max)') AS ItemValue
FROM @xml.nodes(N'/fields/field') AS A(fld)
OUTER APPLY A.fld.nodes(N'items/item') AS B(itm);
Первый .nodes()
возвращается с фрагментами XML, по одному для каждого поля, второй узел вызывается для каждого из этих фрагментов поля, чтобы выбрать свои элементы.
Используйте OUTER APPLY
, если могут быть поля без <item>
узлов и CROSS APPLY
, если вы не хотите видеть поля без <item>
узлов (аналогично LEFT JOIN
против INNER JOIN
)