Я бы предпочел навигацию вперед.Можно использовать ../c1
, как и в другом ответе, но, насколько я знаю, производительность не самая лучшая.Это альтернатива:
DECLARE @xml XML =
N'<row id="1">
<c1>rec1</c1>
<c2>a</c2>
<c2>b</c2>
<c2>c</c2>
</row>';
SELECT A.r.value('@id','int') AS row_id
,A.r.value('(c1/text())[1]','nvarchar(10)') AS c1
,B.c2.value('text()[1]','nvarchar(10)') AS c2
FROM @xml.nodes('/row') A(r)
CROSS APPLY A.r.nodes('c2') B(c2);
Если в вашем XML есть только один <row>
, лучше всего было бы
SELECT @xml.value('(/row/@id)[1]','int') AS row_id
,@xml.value('(/row/c1/text())[1]','nvarchar(10)') AS c1
,B.c2.value('text()[1]','nvarchar(10)') AS c2
FROM @xml.nodes('/row/c2') B(c2);