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
相关产品推荐
相关产品推荐

