2013-09-03 3 views
5

Это мой пример XML:конкатенации значений XML при выборе с помощью XQuery в T-SQL

<root> 
    <element> 
     <subelement> 
      <value code="code1">value1</value> 
      <value code="code2">value2</value> 
     </subelement> 
    </element> 
</root> 

И это мой тест запрос:

DECLARE @tempTable TABLE (
    ValueCode nvarchar(MAX), 
    Value nvarchar(MAX) 
) 

DECLARE @xml XML 
select @xml = cast(c1 as xml) from OPENROWSET (BULK 'C:\test.xml', SINGLE_BLOB) as T1(c1) 

INSERT INTO @tempTable 
SELECT 
    Tbl.Col.value('subelement[1]/@code', 'NVARCHAR(MAX)'), 
    Tbl.Col.value('subelement[1]', 'NVARCHAR(MAX)') 
FROM @xml.nodes('//element') Tbl(Col) 

SELECT * FROM @tempTable 

Запрос, при выполнении выдает строка с столбцом ValueCode, содержащим NULL, и столбец Value, содержащий значение «value1value2». То, что я хотел бы получить, будет атрибутами и значениями, объединенными с разделителем. Например, мне нужно, чтобы ValueCode содержал 'code1; code2 'и Value, чтобы содержать' значение 1; значение2' . Как я могу это достичь?

ответ

5

вы можете использовать xuery, если вы хотите сцепленные строки:

SELECT 
    Tbl.Col.query('for $i in value return concat($i/text()[1], ";")').value('.', 'nvarchar(max)'), 
    Tbl.Col.query('for $i in value return concat($i/@code, ";")').value('.', 'nvarchar(max)') 
FROM @xml.nodes('root/element/subelement') Tbl(Col); 

, если вы хотите, чтобы ваши значения в строки:

SELECT 
    Tbl.Col.value('.', 'nvarchar(max)'), 
    Tbl.Col.value('@code', 'nvarchar(max)') 
FROM @xml.nodes('root/element/subelement/value') Tbl(Col); 

sql fiddle demo