如何为xml节点sql server选择每个值

Posted

技术标签:

【中文标题】如何为xml节点sql server选择每个值【英文标题】:How to select each value for xml node sql server 【发布时间】:2015-12-11 11:10:55 【问题描述】:

我的 sql server 表中有一个 xml 列,其中的 XML 如下所示:

<Alternate>
    <Suggestion>
        <Details>
            <Number>51</Number>
        </Details>
    </Suggestion>
    <Suggestion>
        <Details>
            <Number>53</Number>
        </Details>
    </Suggestion>
</Alternate>

我希望能够将 Number 标签的每个值提取到如下所示的列中:

Number
51
53

我曾尝试使用 CROSS APPLY 进行此操作,但它只提取每行的第一个值:

Number
51
51

我为此编写的 SQL 查询如下所示:

SELECT [XML].value('(//Alternate/Suggestion/Details/Number)[1]','nvarchar(255)') as Improvement_Number
FROM Table
CROSS APPLY [XML].nodes('(//Aternate/Suggestion/Details/Number)') AS T2(Improv)

有人可以向我解释一下我做错了什么吗? 任何帮助都会很棒

谢谢

【问题讨论】:

【参考方案1】:

像这样创建表并插入一行:

create table alternate ([XML] xml)

insert into alternate values (N'<Alternate>
    <Suggestion>
        <Details>
            <Number>51</Number>
        </Details>
    </Suggestion>
    <Suggestion>
        <Details>
            <Number>53</Number>
        </Details>
    </Suggestion>
</Alternate>')

可以这样查询:

select 
    b.Improv.value('.', 'nvarchar(255)') Number
from 
    alternate a
    cross apply a.[XML].nodes('//Alternate/Suggestion/Details/Number') b(Improv)

结果:

Number
51
53

【讨论】:

以上是关于如何为xml节点sql server选择每个值的主要内容,如果未能解决你的问题,请参考以下文章

如何为 SQL Server(Windows 身份验证)配置 Spring XML?

如何为每个 XML 节点添加换行符?

如何为多个参数值显示特定字段中的所有值? SQL Server 报表生成器

SQL:如何为一列中具有重复值的每组行选择一行?

如果没有插入值,如何为 SQL Server 中的列字段分配唯一值?

如何为SQL Server数据库中的所有表创建触发器