• OPENXML解析sp_xml_preparedocument获取的XML句柄


    1、sp_xml_preparedocument与sp_xml_removedocument

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

    sp_xml_preparedocument 
    hdoc OUTPUT 
    [ , xmltext ] 
    [ , xpath_namespaces ]
    

    hdoc
    新建文档的句柄。 hdoc是一个整数。

    xmltext ]
    是原来的 XML 文档。

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

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

    sp_xml_removedocument hdoc 
    

    hdoc
    新建文档的句柄。

    2、OPENXML

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

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

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

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

    flag
    指示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。 flag 为可选输入参数,可以是下列值之一。

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

     

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

    • ColName
      • 行集中的列名。
    • ColType
      • 行集中列的 SQL Server 数据类型。 如果列类型不同于属性的基础 xml 数据类型,则将发生类型强制。
    • ColPattern
      • 可选的通用 XPath 模式,它说明应如何将 XML 节点映射到列。 如果没有指定 ColPattern,则发生默认映射(由 flag 指定的“以属性为中心”或“以元素为中心”的映射)。指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质(如果发生“以属性为中心”和“以元素为中心”的映射),这些特殊的映射性质可以重写或增强由 flag 所指示的默认映射。指定为 ColPattern 的通用 XPath 模式也支持元属性。
    • MetaProperty
      • 由 OPENXML 提供的元属性之一。 如果指定 MetaProperty,则该列包含元属性提供的信息。 使用元属性可以提取有关 XML 节点的信息(如相对位置和命名空间信息)。 它提供了比文本表示形式更详细的信息。

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

     

    3、实例

    (1)XML内容

    DECLARE @xmlResult XML
    --XML句柄
    DECLARE @docHandle INT
    
    SET @xmlResult=N'<ImgLabelPointRootXml>
        <Imgs>
            <ImgLabelPointModel photoid="105BDF53-1DF2-4C7D-B058-4CDB9A8BA152" isvalid="1">
                <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 photoid="AA001EAC-8AAC-4D08-98BC-82F27C0CBD73" isvalid="1">
                <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
    

    (3)按属性获取

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

    (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'

     

    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

  • 相关阅读:
    LeetCode 414. Third Maximum Number
    LeetCode 498. Diagonal Traverse
    LeetCode 520. Detect Capital
    LeetCode 503. Next Greater Element II
    LeetCode 496. Next Greater Element I
    LeetCode 508. Most Frequent Subtree Sum
    LeetCode 515. Find Largest Value in Each Tree Row
    LeetCode 516. Longest Palindromic Subsequence
    输入输出流
    java中举例说明对象调用静态成员变量
  • 原文地址:https://www.cnblogs.com/hepc/p/9684600.html
Copyright © 2020-2023  润新知