如何用XML查询函数获取指定TypeId对应的ItemId(T-SQL游标场景)
精准获取XML中指定TypeId的ItemId值(保留游标逻辑)
核心问题定位
原脚本中edi_PIA_SA和edi_PIA_IN的.value()查询失效,是因为XPath表达式未精准匹配XML的层级结构,无法筛选出对应TypeId的目标节点。
修正后的T-SQL脚本
假设你的XML结构示例(可替换为实际数据)
<EDIData> <Products> <Product> <PIASegment> <TypeId>GTIN</TypeId> <ItemId>9876543210987</ItemId> </PIASegment> <PIASegment> <TypeId>SA</TypeId> <ItemId>SAPROD001</ItemId> </PIASegment> <PIASegment> <TypeId>IN</TypeId> <ItemId>INPROD001</ItemId> </PIASegment> </Product> </Products> </EDIData>
带游标逻辑的修正脚本
DECLARE @InputXML XML = '<!-- 替换为你的实际XML内容 -->' -- 声明游标 DECLARE ProductCursor CURSOR FOR SELECT -- 原GTIN查询保留(若原XPath正确) prod.node.value('(PIASegment[TypeId="GTIN"]/ItemId)[1]', 'NVARCHAR(50)') AS GTIN, -- 修正SA类型的ItemId查询:精准筛选TypeId=SA的节点 prod.node.value('(PIASegment[TypeId="SA"]/ItemId)[1]', 'NVARCHAR(50)') AS edi_PIA_SA, -- 修正IN类型的ItemId查询:精准筛选TypeId=IN的节点 prod.node.value('(PIASegment[TypeId="IN"]/ItemId)[1]', 'NVARCHAR(50)') AS edi_PIA_IN FROM @InputXML.nodes('/EDIData/Products/Product') AS prod(node) -- 初始化变量 DECLARE @GTIN NVARCHAR(50), @SAItem NVARCHAR(50), @INItem NVARCHAR(50) -- 打开游标并处理数据 OPEN ProductCursor FETCH NEXT FROM ProductCursor INTO @GTIN, @SAItem, @INItem WHILE @@FETCH_STATUS = 0 BEGIN -- 这里添加你的业务逻辑(如插入表、打印输出等) PRINT CONCAT('GTIN: ', @GTIN, ' | SA编码: ', ISNULL(@SAItem, '无'), ' | IN编码: ', ISNULL(@INItem, '无')) FETCH NEXT FROM ProductCursor INTO @GTIN, @SAItem, @INItem END -- 清理游标 CLOSE ProductCursor DEALLOCATE ProductCursor
关键修正说明
- XPath条件筛选:使用
PIASegment[TypeId="SA"]精准定位到TypeId子节点值为SA的PIASegment节点,再通过/ItemId获取对应的值 - 节点索引
[1]:添加[1]确保只返回第一个匹配的节点,避免XML中存在多个同类型节点时引发的查询错误 - 适配实际XML结构:如果你的XML节点名称(如
PIASegment)或层级路径不同,只需修改XPath中的节点前缀部分,核心的条件筛选逻辑保持不变
内容的提问来源于stack exchange,提问作者Drube
相关产品推荐
相关产品推荐

