基于另一个节点值的少量节点的XML值

时间:2015-06-02 13:48:38

标签: sql sql-server xml

我无法找到问题的解决方案,我希望对某些人来说很容易。

以下是我的xml的一部分:

<Income>    
    <IncomeItem>
         <TypeId>29</TypeId>
         <Description>test1</Description>
     </IncomeItem>
     <IncomeItem>
         <TypeId>29</TypeId>
         <Description>test2</Description>
     </IncomeItem>
     <IncomeItem>
        <TypeId>29</TypeId>
        <Description>test3</Description>
    </IncomeItem>
</Income>

我需要输出:test1 test2 test3

TypeId会有更多类型,因此Description的值必须基于TypeId

伪代码看起来像:

Select Decsription From XML where TypeId = 29

1 个答案:

答案 0 :(得分:1)

这是一种可能的方式:

declare @xml XML = '<Income>    
    <IncomeItem>
         <TypeId>29</TypeId>
         <Description>test1</Description>
     </IncomeItem>
     <IncomeItem>
         <TypeId>29</TypeId>
         <Description>test2</Description>
     </IncomeItem>
     <IncomeItem>
        <TypeId>29</TypeId>
        <Description>test3</Description>
    </IncomeItem>
</Income>'

SELECT x.value('Description[1]','varchar(max)') as 'description'
FROM @xml.nodes('//IncomeItem[TypeId=29]') i(x)

如果要将Description值连接成一行,一种可能的方法是使用xquery for循环(和concat()函数在值之间追加空格(如果需要)): / p>

SELECT @xml.query('for $d in //IncomeItem[TypeId=29]/Description return concat($d, " ")')
           .value('.','varchar(max)') as 'description'

<强> SQL Fiddle

供参考:[MSDN] FLWOR Statement and Iteration (XQuery)