2016-11-23 3 views
0

Когда я запрашиваю столбец xml во временной переменной, результаты конкатенируются, если элемент xml имеет несколько значений. Ниже приведена выдержка из столбца xml.TSql xml query является конкатенацией значений

<metadata> 
    <dataType>Date</dataType> 
    <tags> 
     <tag>SPA</tag> 
     <tag>Timed Release</tag> 
    </tags> 
</metadata> 

Обратите внимание на два элемента тега. Мне нужен один ряд для каждого элемента тега. Вот мой query-

SELECT id, 
    dataType = [Type].value('(/metadata/tags)[1]', 'varchar(max)') 
FROM 
@tmpProperty 

, который производит ниже

id | dataType 
-----+------------------- 
6357 | SPATimed Release 

если изменить запрос к

SELECT id, 
dataType = [Type].value('(/metadata/tags/tag)[1]', 'varchar(max)') 
FROM 
@tmpProperty 

я

id | dataType 
-----+----------- 
6357 | SPA 

Оба результата являются неправильными. Один объединяется в одну строку вместо двух строк, а другой просто возвращает одно значение. Я использую SQL Server 2012. Как я могу это исправить?

ответ

1

Вы должны использовать nodes() первый, чтобы получить несколько строк, то вы можете использовать value() для извлечения данных:

DECLARE @tmpProperty TABLE (ID INT IDENTITY, [Type] XML); 
INSERT @tmpProperty([Type]) 
VALUES ('<metadata> 
    <dataType>Date</dataType> 
    <tags> 
     <tag>SPA</tag> 
     <tag>Timed Release</tag> 
    </tags> 
</metadata>'); 

SELECT id, 
     dataType = Tags.value('(text())[1]', 'varchar(max)') 
FROM @tmpProperty AS t 
     CROSS APPLY t.[Type].nodes('/metadata/tags/tag') AS n (Tags); 
+0

Отлично! Благодаря! –

Смежные вопросы