连接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
答
如果没有其他标准,所有你需要做的是检索这些值作为一个单一的东西,你可以做这样的事情:
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列。
我喜欢这个,+1从我的身边,但要意识到,如果连接字符串包含空格,则逗号替换不起作用... – Shnugo
伟大的观点@Shnugo!谢谢。 – Parfait