连接SQL Server XML解析

问题描述:

我在xml类型的“测试”列中拥有一组XML。桌子是“牛”。连接SQL Server XML解析

<p> 
    <k>query</k> 
    <v> 
    <w id="a" name="b"> 
     <p> 
     <op>IN</op> 
     <v name="apple">1</v> 
     <v name="pear">2</v> 
     <v name="kiwi">3</v> 
     <v name="carrot">4</v> 
     </p> 
    </w> 
    </v> 
</p> 

我想编写一个select语句,返回值为“apple,pear,kiwi,carrot”的1行1列。这甚至有可能吗?

考虑使用XQuery的data()函数,它接受一个序列的项目和雾化他们:

CREATE TABLE #cow(cow XML); 

INSERT INTO #cow 
SELECT (N'<p> 
      <k>query</k> 
      <v> 
      <w id="a" name="b"> 
       <p> 
       <op>IN</op> 
       <v name="apple">1</v> 
       <v name="pear">2</v> 
       <v name="kiwi">3</v> 
       <v name="carrot">4</v> 
       </p> 
      </w> 
      </v> 
     </p>');  

select cow.query('data(/p/v/w/p/v/@name)') as example from #cow 

# example 
#1 apple pear kiwi carrot 

对于逗号分隔值:

select REPLACE(CONVERT(nvarchar(255), cow.query('data(/p/v/w/p/v/@name)')), 
       ' ', ', ') as example from #cow 

# example 
#1 apple, pear, kiwi, carrot 
+1

我喜欢这个,+1从我的身边,但要意识到,如果连接字符串包含空格,则逗号替换不起作用... – Shnugo

+0

伟大的观点@Shnugo!谢谢。 – Parfait

如果没有其他标准,所有你需要做的是检索这些值作为一个单一的东西,你可以做这样的事情:

SELECT STUFF((SELECT ', ' + A.B.value('@name', 'NVARCHAR(255)') 
FROM cow 
CROSS APPLY test.nodes('p/v/w/p/v') A(B) 
FOR XML PATH('')), 1, 2, '') 

讽刺的是,FOR XML PATH对事实没有影响它是一个开始的XML列。