You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server XQuery始终返回NULL问题排查及动态方案求助

问题分析与解决方案

1. 原SQL语句的问题

你的SELECT语句存在两个关键错误:

  • tagFour是<Detailed>元素的属性而非子节点,不能用tagFour/node()语法获取值,正确的属性访问写法是@tagFour。
  • 原路径(object/Overview/Request/Detailed/@tagFour)[1]会匹配第一个<Detailed>节点(对应Id=1的Request),但该节点并没有tagFour属性,因此返回NULL。

2. 获取值为"Data"的特定tagFour

如果要精准提取值为"Data"的tagFour属性,可通过XPath条件过滤实现:

declare @data xml = '<object>
    <Overview Requester="Me">
        <Request GetData="Y" Title="Get First SQL DataSet in XML" Id="1">
            <Detailed tagOne="yap" tagTwo="Yap">
                <!--Further elements/attributes if needed -->
            </Detailed>
        </Request>
        <Request GetData="N" Title="Get Second SQL DataSet in XML" Id="2">
            <Detailed tagThree="yap" tagFour="Yap">
                <!--Further elements/attributes if needed -->
            </Detailed>
        </Request>
        <Request GetData="Y" Title="Get Third SQL DataSet in XML" Id="3">
            <Detailed tagFour="Data" tagFive="data2" />
        </Request>
    </Overview>
</object>'

select @data.value('(object/Overview/Request/Detailed[@tagFour="Data"]/@tagFour)[1]', 'nvarchar(max)') as tagFourData

3. 动态提取所有含tagFour的节点(不限Id)

如果要获取所有包含tagFour属性的节点值,同时关联对应Request的Id,可使用nodes()方法拆分XML节点:

select 
    req.value('@Id', 'int') as RequestId,
    det.value('@tagFour', 'nvarchar(max)') as tagFourData
from @data.nodes('object/Overview/Request') as t(req)
cross apply req.nodes('Detailed') as t2(det)
where det.exist('@tagFour') = 1

该查询会返回所有带有tagFour属性的<Detailed>节点数据,不受所属Request的Id限制。

4. 获取第一个存在tagFour的节点值

如果仅需提取第一个含有tagFour属性的值(不限Id),可调整XPath过滤逻辑:

select @data.value('(object/Overview/Request/Detailed[@tagFour]/@tagFour)[1]', 'nvarchar(max)') as tagFourData

这里的[@tagFour]用于筛选存在tagFour属性的<Detailed>节点,再取第一个匹配的属性值。


内容的提问来源于stack exchange,提问作者Aiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:17:18