2014-12-23 2 views
2

У меня есть следующий XML в столбце XML в SQL Server.Как я могу запросить столбец XML SQL Server и вернуть все значения для определенного узла?

<qualifiers> 
    <qualifier> 
     <key>111</key> 
     <message>a match was not found</message> 
    </qualifier> 
    <qualifier> 
     <key>222</key> 
     <message>a match was found</message> 
    </qualifier> 
    <qualifier> 
     <key>333</key> 
     <message>error</message> 
    </qualifier> 
    </qualifiers> 

Как я могу написать TSQL, чтобы вернуть все значения в отборочной/классификаторе/сообщения в разделенных запятыми строку? Моя цель состоит в том, чтобы запрос возвращал значения из XML в один столбец для каждой строки.

Результаты должны выглядеть следующим образом:

"a match was not found, a match was found, error" 
+3

Пример: http://stackoverflow.com/questions/4379039/get-xml-nodes-from-sql-server-column-as-comma-separated-list – xQbert

ответ

3

SQLFiddle для то же: Решение согласно @xQbert, предложенное

create table Temp (col1 xml) 
go 

insert into Temp (col1) 
values('<qualifiers> 
    <qualifier> 
     <key>111</key> 
     <message>a match was not found</message> 
    </qualifier> 
    <qualifier> 
     <key>222</key> 
     <message>a match was found</message> 
    </qualifier> 
    <qualifier> 
     <key>333</key> 
     <message>error</message> 
    </qualifier> 
    </qualifiers>') 
go 

SELECT 
    STUFF((SELECT 
       ',' + fd.v.value('(.)[1]', 'varchar(50)') 
      FROM 
       Temp 
      CROSS APPLY 
       col1.nodes('/qualifiers/qualifier/message') AS fd(v) 
      FOR XML PATH('') 
     ), 1, 1, '') 
0

Я считаю, что это то, что вы ищете: - это от LINK: - http://blog.sqlauthority.com/2009/02/13/sql-server-simple-example-of-reading-xml-file-using-t-sql/

DECLARE @MyXML XML 
SET @MyXML = '<SampleXML> 
<Colors> 
<Color1>White</Color1> 
<Color2>Blue</Color2> 
<Color3>Black</Color3> 
<Color4 Special="Light">Green</Color4> 
<Color5>Red</Color5> 
</Colors> 
<Fruits> 
<Fruits1>Apple</Fruits1> 
<Fruits2>Pineapple</Fruits2> 
<Fruits3>Grapes</Fruits3> 
<Fruits4>Melon</Fruits4> 
</Fruits> 
</SampleXML>' 

SELECT 
a.b.value('Colors[1]/Color1[1]','varchar(10)') AS Color1, 
a.b.value('Colors[1]/Color2[1]','varchar(10)') AS Color2, 
a.b.value('Colors[1]/Color3[1]','varchar(10)') AS Color3, 
a.b.value('Colors[1]/Color4[1]/@Special','varchar(10)')+' '+ 
+a.b.value('Colors[1]/Color4[1]','varchar(10)') AS Color4, 
a.b.value('Colors[1]/Color5[1]','varchar(10)') AS Color5, 
a.b.value('Fruits[1]/Fruits1[1]','varchar(10)') AS Fruits1, 
a.b.value('Fruits[1]/Fruits2[1]','varchar(10)') AS Fruits2, 
a.b.value('Fruits[1]/Fruits3[1]','varchar(10)') AS Fruits3, 
a.b.value('Fruits[1]/Fruits4[1]','varchar(10)') AS Fruits4 
FROM @MyXML.nodes('SampleXML') a(b) 
Смежные вопросы