SQL查询XML中KeyValuePair/Value下HHQuoteData节点无返回问题
问题背景
我的XML结构如下图所示:
需求:从XML的KeyValuePair/Value集合中选取HHQuoteData节点。
当前运行如下代码未返回任何数据:
SELECT k.kv.query('KeyValuePair/Value/HHQuoteData') FROM DeclinedQuote.RequestLogXMLsToProcess aph CROSS APPLY [PayloadXML].nodes('/server/requests/Session.setDocumentRq/session/data/policy/AdditionalData') A (ad) CROSS APPLY a.ad.nodes('KeyValuePair') k (kv) WHERE k.kv.exist('(/Value[contains(.,"HHQuoteData")])') = 1
错误原因
代码存在三处逻辑错误:
- 路径上下文错误:第二次
CROSS APPLY已经将上下文节点定位到KeyValuePair层级,SELECT子句中仍写KeyValuePair/Value/HHQuoteData,相当于在当前KeyValuePair节点下查找同名子节点,路径不匹配。 - 匹配逻辑错误:
exist()中使用contains(.,"HHQuoteData")是匹配节点的文本内容包含HHQuoteData字符串,而需求是匹配Value节点下名为HHQuoteData的子节点,判断条件完全写错。 - 路径写法错误:
exist()中的路径以/开头代表从XML根节点查找绝对路径,当前上下文已经在KeyValuePair节点下,写绝对路径无法匹配到当前节点下的子元素。
修正后代码
SELECT k.kv.query('Value/HHQuoteData') FROM DeclinedQuote.RequestLogXMLsToProcess aph CROSS APPLY [PayloadXML].nodes('/server/requests/Session.setDocumentRq/session/data/policy/AdditionalData') A (ad) CROSS APPLY ad.nodes('KeyValuePair') k (kv) WHERE k.kv.exist('Value/HHQuoteData') = 1
补充说明:如果你的XML是标准键值对结构,即
Key节点存储字段名、Value节点存储对应内容(Key的文本值为HHQuoteData,对应Value存目标数据),则需要将WHERE条件调整为k.kv.exist('Key[text()="HHQuoteData"]') = 1,查询时直接取对应Value节点内容即可。
内容的提问来源于stack exchange,提问作者user1716729
相关产品推荐
相关产品推荐

