①使用sp_xml_preparedocument解析有固定路径与字段名(相同命名节点)的XML:
--要解析的内容为@DataXML
DECLARE @DataXml XML
set @DataXml=N'<Root><Feeder item="0302C2RQ" GCname="测试111" ></Feeder><Feeder item="0302C2RQ" GCname="测试222" ></Feeder></Root>'
--使用sp_xml_preparedocument读取XML
DECLARE @xdoc INT;
EXEC sp_xml_preparedocument @xdoc OUTPUT, @DataXml;
--使用OPENXML获取XML数据
SELECT a.*
FROM
OPENXML(@xdoc, '/Root/Feeder', 1)
WITH ( item varchar(500),
GCname varchar(max)
) AS a;
本例结果为:
OPENXML有三个参数:
第一个是sp_xml_preparedocument读取的OUTPUT参数,在本例中为@xdoc
第二个是一个XPath表达式,用来获取指定位置的数据
第三个是一个可选项,用来表示获取的方式,有0,1,2,8四种取值:
FROM后面的WITH也是可选的,用来指定获取哪些数据字段。
②使用nodes获取相同命名节点的XML
declare @p1 xml
set @p1=convert(xml,N'<en><column0>370705</column0>
<column1>GRN200物料编码</column1><column2>RK20-202入库单</column2>
<column3>ML20-2020领料单</column3><column4>IQC20081检验单</column4>
<column5>K-YS-料号</column5><column6>SMD陶瓷电容</column6></en>')
SELECT
C.value('local-name(.)','nVARCHAR(max)') AS ElementName,
C.value('.','nVARCHAR(max)') AS ElementValue
FROM @p1.nodes('/*/*') T(C)
本例结果为:
若取两个节点下的nodes多加一个’/*’,如:
declare @p1 xml
set @p1=convert(xml,N'<table><en><column0>370705</column0><column1>GRN200物料编码</column1><column2>RK20-202入库单</column2>
<column3>ML20-2020领料单</column3><column4>IQC20081检验单</column4>
<column5>K-YS-料号</column5><column6>SMD陶瓷电容</column6></en></table>')
SELECT
C.value('local-name(.)','nVARCHAR(max)') AS ElementName,
C.value('.','nVARCHAR(max)') AS ElementValue
FROM @p1.nodes('/*/*/*') T(C)
本例结果为: