zoukankan      html  css  js  c++  java
  • SQL中的OpenXML使用

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" 
               OrderDate="1996-07-04T00:00:00">
          <OrderDetail ProductID="11" Quantity="12"/>
          <OrderDetail ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" 
               OrderDate="1996-08-16T00:00:00">
          <OrderDetail ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    -- SELECT stmt using OPENXML rowset provider
    SELECT *
    FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
             WITH (OrderID       int         '../@OrderID',
                   CustomerID  varchar(10) '../@CustomerID',
                   OrderDate   datetime    '../@OrderDate',
                   ProdID      int         '@ProductID',
                   Qty         int         '@Quantity')

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
          <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
          <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    -- Execute a SELECT statement that uses the OPENXML rowset provider.
    SELECT    *
    FROM       OPENXML (@idoc, '/ROOT/Customer',1)
                WITH (CustomerID  varchar(10),
                      ContactName varchar(20))

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customers CustomerID="VINET" ContactName="Paul Henriot">
       <Orders CustomerID="VINET" EmployeeID="5" OrderDate=
               "1996-07-04T00:00:00">
          <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
          <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
       </Orders>
    </Customers>
    <Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
               "1996-08-16T00:00:00">
          <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
       </Orders>
    </Customers>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    -- SELECT statement that uses the OPENXML rowset provider.
    SELECT    *
    FROM       OPENXML (@idoc, '/ROOT/Customers')
    EXEC sp_xml_removedocument @idoc

    declare @idoc int 
    declare @GoodsXml nvarchar(max);
    set @GoodsXml='<OrderItemGoods><Goods><GoodsAttributeId>21</GoodsAttributeId><GoodsCount>2</GoodsCount><GoodsPrice>1.1</GoodsPrice><GoodsId>1</GoodsId></Goods><Goods><GoodsId>2</GoodsId><GoodsAttributeId>22</GoodsAttributeId><GoodsCount>2</GoodsCount><GoodsPrice>1.1</GoodsPrice></Goods><Goods><GoodsId>3</GoodsId><GoodsAttributeId>23</GoodsAttributeId><GoodsCount>2</GoodsCount><GoodsPrice>1.1</GoodsPrice></Goods></OrderItemGoods>'
    exec sp_xml_preparedocument @idoc output, @GoodsXml ;
    select 
        T.GoodsId, 
        T.GoodsAttributeId, 
        T.GoodsCount, 
        T.GoodsPrice
    from 
    openxml(@idoc, '/OrderItemGoods/Goods',2) 
    with 
    ( 
      GoodsId bigint 'GoodsId', 
      GoodsAttributeId bigint, 
      GoodsCount int, 
      GoodsPrice float
    )as T
    --where T.GoodsId=1 
    --系统sp_xml_removedocument删除SQLServer服务器内存中的XML数据
    exec sp_xml_removedocument @idoc ;

    OpenXml用法

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

    说明:

    通过使用 SchemaDeclaration 或指定一个现有 TableName,WITH 子句提供一种行集格式(根据需要还可提供其他映射信息)。如果没有指定可选的 WITH 子句,则以“边缘”表格式返回结果。边缘表在单个表中表示 XML 文档的细密结构(例如,元素/属性名、文档层次结构、命名空间、处理说明等)。

    下表介绍了“边缘”表的结构。

    列名数据类型说明

    id

    bigint

    文档节点的唯一 ID。

    根元素的 ID 值为 0。保留负 ID 值。

    parentid

    bigint

    标识节点的父节点。此 ID 所标识的父节点不一定是父元素,而是取决于此 ID 所标识节点的子节点的 NodeType。例如,如果节点是文本节点,则其父节点可能是属性节点。

    如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。

    nodetype

    int

    标识节点类型。一个对应于 XML DOM 节点类型编号的整数。

    节点类型包括:

    1 = 元素节点

    2 = 属性节点

    3 = 文本节点

    localname

    nvarchar

    给出元素或属性的本地名称。如果 DOM 对象没有名称,则为 NULL。

    prefix

    nvarchar

    节点名称的命名空间前缀。

    namespaceuri

    nvarchar

    节点的命名空间 URI。如果值为 NULL,则命名空间不存在。

    datatype

    nvarchar

    元素或属性行的实际数据类型,否则为 NULL。从内联 DTD 中或从内联架构中推断数据类型。

    prev

    bigint

    前一个同级元素的 XML ID。如果前面没有同级元素,则为 NULL。

    text

    ntext

    包含文本格式的属性值或元素内容(如果“边缘”表项不需要值,则为 NULL)。

    idoc

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

    rowpattern

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

    flags

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

    字节值说明

    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,则发生默认映射(由 flags 指定的“以属性为中心”或“以元素为中心”的映射)。

    指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质(如果发生“以属性为中心”和“以元素为中心”的映射),这些特殊的映射性质可以重写或增强由 flags 所指示的默认映射。

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

    MetaProperty

    由 OPENXML 提供的元属性之一。如果指定 MetaProperty,则该列包含元属性提供的信息。使用元属性可以提取有关 XML 节点的信息(如相对位置和命名空间信息)。它提供了比文本表示形式更详细的信息。

    TableName

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

  • 相关阅读:
    FreeIPA部署及基本使用
    第7天:Django模板使用与表单
    第6天:数据库配置与模型
    第5天:基于类的视图与中间件
    linux下修改MySQL表名与表的字符编码
    webService理解(一)
    查询MySQL库下所有表名,数据为空的表名
    linux中MySQL连接找不到mysql.sock文件
    初步书写Webservice项目,运行后报错:Cannot assign requested address: bind
    linux配置jdk,MySQL环境
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/5146392.html
Copyright © 2011-2022 走看看