1、sp_xml_preparedocument与sp_xml_removedocument

(1)sp_xml_preparedocument返回可用于访问新创建的内部表示形式的 XML 文档的句柄。

sp_xml_preparedocument 
hdoc OUTPUT 
[ , xmltext ] 
[ , xpath_namespaces ]

hdoc是一个整数。

是原来的 XML 文档。

指定在 OPENXML 的行和列 XPath 表达式中使用的命名空间声明。未指定将使用默认的命名空间前缀映射。

(2)sp_xml_removedocument删除文档句柄指定的 XML 文档的内部表示形式并使该文档句柄无效。

sp_xml_removedocument hdoc 

新建文档的句柄。

 

2、OPENXML

OPENXML用来解析sp_xml_preparedocument获取的XML句柄。

OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )   
[ WITH ( SchemaDeclaration | TableName ) ]  

通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式形式。

XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。

flag 为可选输入参数,可以是下列值之一。

字节值 描述
0 默认为“以属性为中心”的映射。
1 这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。
2 这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。
8 在检索上下文中,此标记指明不得将已用数据复制到溢出属性 @mp:xmltext。

 

是窗体的架构定义:ColNameColType [ColPattern | MetaProperty] [,ColNameColType [* ColPattern* | MetaProperty]...]

 

  • ColName
    • 行集中的列名。

 

 

  • ColType
    • 如果列类型不同于属性的基础 xml 数据类型,则将发生类型强制。

 

 

  • ColPattern
    • 指定为 ColPattern 的通用 XPath 模式也支持元属性。

 

 

  • MetaProperty
    • 它提供了比文本表示形式更详细的信息。

 

如果具有所需架构的表已经存在且不要求列模式,则为给定的表名(而不是 SchemaDeclaration)。

 

3、实例

(1)XML内容

DECLARE @xmlResult XML
--XML句柄
DECLARE @docHandle INT

SET @xmlResult=N'<ImgLabelPointRootXml>
    <Imgs>
        <ImgLabelPointModel photo>
            <photoid>105BDF53-1DF2-4C7D-B058-4CDB9A8BA152</photoid>
            <isvalid>1</isvalid>
            <status>1</status>
            <height>400.123</height>
            <Width>299.84</Width>
            <InitHeight>2580.00</InitHeight>
            <CheckDetailId p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
        </ImgLabelPointModel>
        <ImgLabelPointModel photo>
            <photoid>AA001EAC-8AAC-4D08-98BC-82F27C0CBD73</photoid>
            <isvalid>1</isvalid>
            <status>0</status>
            <height p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <Width p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <InitHeight p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <CheckDetailId>100012004</CheckDetailId>
        </ImgLabelPointModel>
    </Imgs>
    <Points>
        <ImgLabelPointBoxModel skucode="600152" top="210.28">
            <skucode>600152</skucode>
            <top>210.28</top>
            <left>143.39</left>
            <CheckDetailId p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <SameGuid>5B07D255-E0FA-4A00-80B7-AA4BD4E43AD0</SameGuid>
            <photoid>105BDF53-1DF2-4C7D-B058-4CDB9A8BA152</photoid>
        </ImgLabelPointBoxModel>
        <ImgLabelPointBoxModel skucode="600153" top="210.75">
            <skucode>600153</skucode>
            <top>210.75</top>
            <left>103.45</left>
            <CheckDetailId p4:nil="true" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" />
            <SameGuid>5D809A5D-5D11-4689-A96E-68891D63D8F0</SameGuid>
            <photoid>105BDF53-1DF2-4C7D-B058-4CDB9A8BA152</photoid>
        </ImgLabelPointBoxModel>
    </Points>
</ImgLabelPointRootXml>'

表结构

CREATE TABLE #tempImgs( 
	photoid VARCHAR(50),
	isvalid INT ,
	status INT,
	height DECIMAL(10,6),
	--Width DECIMAL(10,6),
	--InitHeight DECIMAL(10,6),
	CheckDetailId INT 
)
CREATE TABLE #tempPoints(
	skucode INT ,
	[top] DECIMAL(10,6),
	[left] DECIMAL(10,6),
	--CheckDetailId INT,
	SameGuid VARCHAR(50),
	photoid VARCHAR(50)
)    

(2)按元素获取

EXEC sp_xml_preparedocument @docHandle OUTPUT,@xmlResult			
INSERT INTO #tempPoints
SELECT * FROM OPENXML(@docHandle,'/ImgLabelPointRootXml/Points/ImgLabelPointBoxModel',2)
WITH #tempPoints
SELECT * FROM #tempPoints

OPENXML解析sp_xml_preparedocument获取的XML句柄

(3)按属性获取

EXEC sp_xml_preparedocument @docHandle OUTPUT,@xmlResult			
INSERT INTO #tempPoints
SELECT * FROM OPENXML(@docHandle,'/ImgLabelPointRootXml/Points/ImgLabelPointBoxModel',1)
WITH #tempPoints

OPENXML解析sp_xml_preparedocument获取的XML句柄

(4)指定XPath混合获取

EXEC sp_xml_preparedocument @docHandle OUTPUT,@xmlResult			
INSERT INTO #tempPoints
SELECT * FROM OPENXML(@docHandle,'/ImgLabelPointRootXml/Points/ImgLabelPointBoxModel',1)
WITH (
	skucode INT ,
	[top] DECIMAL(10,6),
	[left] DECIMAL(10,6) 'left',
	SameGuid VARCHAR(50) 'SameGuid',
	photoid VARCHAR(50) 'photoid'
)

格式如下

属性:'@ProductID' '../@OrderDate'

元素:'OrderID'

 OPENXML解析sp_xml_preparedocument获取的XML句柄

 

4、注意事项

 (1)转换格式失败需要配合SchemaDeclaration使用,如 Error converting data type nvarchar to numeric in XML data retrieving

----类型转换失败的问题先通过with指定兼容的类型,select再转换
EXEC sp_xml_preparedocument @docHandle OUTPUT,@xmlResult				
INSERT INTO #tempImgs
SELECT photoid,isvalid,status,CASE WHEN ISNUMERIC(height)=1 THEN CAST(height AS DECIMAL(10,6)) ELSE 0 END,CheckDetailId FROM OPENXML(@docHandle,'/ImgLabelPointRootXml/Imgs/ImgLabelPointModel',2) 
WITH (photoid VARCHAR(50),isvalid INT ,status INT,height varchar(20),CheckDetailId INT )

  

参考:

sp_xml_preparedocument (Transact-SQL)

https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-xml-preparedocument-transact-sql?view=sql-server-2017 

OPENXML (Transact-SQL)

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/openxml-transact-sql?view=sql-server-2017

使用sp_xml_preparedocument处理XML文档

https://www.cnblogs.com/oec2003/archive/2011/07/23/2742014.html

 

相关文章:

  • 2022-01-08
  • 2021-08-04
  • 2022-12-23
  • 2022-01-23
  • 2021-05-15
  • 2021-12-27
猜你喜欢
  • 2021-11-14
  • 2021-10-31
  • 2022-12-23
  • 2022-12-23
  • 2022-01-31
  • 2022-01-15
  • 2021-11-17
相关资源
相似解决方案