如何在SQL Server 2022中提取XML类型中的变量值?
解决SQL Server 2022中XML属性提取问题
问题原因分析
你的代码未能正确提取值,核心问题有两点:
- XPath语法错误:XML中的
Name、Variable、Value是<Variable>元素的属性,而非子元素,不能用Name[1]这类子元素查询,需改用@Name语法获取属性值。 - 节点定位错误:
nodes()方法应定位到/Variables/Variable(每个变量元素),而非/Variables(父容器),否则无法正确遍历单个变量。
修正后的SQL代码
-- 创建临时表存储测试数据 select 'Name1' [Name] , '<Variables><Variable Name="Menge [Stk]" Variable="N" Value="1" ClientDoc="0" CDchangeable="0" ValueChangeAble="0" OnProdPaper="0" ExChangeEuro="0" AVSVariable="0"/></Variables>' [VariablesXML] into #TempTable; -- 正确提取XML中的属性值 select T.[Name] , CAST(T.VariablesXML as XML) [VariablesXML] , X.Var.value('@Name', 'nvarchar(max)') [VariableName] , X.Var.value('@Variable', 'nvarchar(max)') [VariableCode] , X.Var.value('@Value', 'nvarchar(max)') [VariableValue] from #TempTable T outer apply CAST(T.VariablesXML as XML).nodes('/Variables/Variable') as X(Var); -- 清理临时表 drop table #TempTable;
关键改动说明
- 直接在
outer apply中转换XML并定位到/Variables/Variable,避免冗余的CTE和表连接 - 使用
@属性名语法提取<Variable>元素的属性值,对应XML中的Name、Variable、Value属性 - 重命名结果列(如
VariableName)避免与原表的Name列冲突
内容的提问来源于stack exchange,提问作者Miroslav
相关产品推荐
相关产品推荐

