SQL读取XML数据函数

--OPENXML (Transact-SQL)


--SQL Server 2008 R2 其他版本 
--OPENXML 通过 XML 文档提供行集视图。由于 OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。
--主题链接图标 Transact-SQL 语法约定
--语法
--OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] ) 
--[ WITH ( SchemaDeclaration | TableName ) ]
--参数
--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)。
--注释
--通过使用 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)。
--示例
--A. 使用带 OPENXML 的简单 SELECT 语句
--以下示例使用 sp_xml_preparedocument 创建 XML 图像的内部表示形式。然后对 XML 文档的内部表示形式执行使用 OPENXML 行集提供程序的 SELECT 语句。
--flag 值设置为 1。该值指示“以属性为中心”的映射。因此,XML 属性映射到行集中的列。指定为 /ROOT/Customer 的 rowpattern 标识要处理的 节点。
--没有指定可选的 ColPattern(列模式)参数,因为列名与 XML 属性名称匹配。
--OPENXML 行集提供程序创建了一个双列行集(CustomerID 和 ContactName),SELECT 语句从该行集中检索必要的列(在本例中检索所有的列)。




DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='


   
     
     
   



   
     
   


'
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
SELECT *
FROM openxml(@hdoc,'/ROOT/Customer/Order/OrderDetail',1)--0:默认为“以属性为中心”的映射 1:默认为“以属性为中心”的映射。可以与XML_ELEMENTS一起使用
WITH (OrderID VARCHAR(40),ProductID VARCHAR(40),Quantity int)
/*查询XML结果*/
--OrderID ProductID Quantity
--10248 11 12
--10248 42 10
--10283 72 3
/**/


--如果将 flags 设置为 2(表示“以元素为中心”的映射)并执行相同的 SELECT 语句,则由于 元素没有任何子元素,所以针对 XML 文档中两个客户的 CustomerID 和 ContactName 的值都返回为 NULL。
--下面是结果集:
--CustomerID ContactName
--NULL       NULL
--NULL       NULL




--B. 为列和 XML 属性之间的映射指定 ColPattern
--下面的查询从 XML 文档返回客户 ID、订单日期、产品 ID 和数量等属性。rowpattern 标识 元素。ProductID 和 Quantity 是 元素的属性。而 OrderID、CustomerID 和 OrderDate 是父元素 () 的属性。
--指定可选的 ColPattern。这包括以下各项:
--行集中的 OrderID、CustomerID 和 OrderDate 映射到 XML 文档中的 rowpattern 所标识节点的父节点属性。
--行集中的 ProdID 列映射到 ProductID 属性,行集中的 Qty 列映射到 rowpattern 中所标识节点的 Quantity 属性。
--尽管“以元素为中心”的映射由 flags 参数指定,但 ColPattern 中指定的映射的优先级高于该映射。
declare @idoc int
declare @doc varchar(1000)
set @doc='


   
     
     
   



   
     
   


'
exec sp_xml_preparedocument @idoc output,@doc
--sp_xml_preparedocument 内置函数
--上面通过sp_xml_preparedocument 读取XML
select * from openXML(@idoc,'/ROOT/Customer/Order/OrderDetail',2)--使用“以元素为中心”的映射。可以与 XML_ATTRIBUTES 一起使用。这种情况下,首先应用“以属性为中心”的映射,然后对所有未处理的列应用“以元素为中心”的映射。
with(
OrderID int  '../@OrderID',
CustomerID varchar(40) '../@CustomerID',
OrderData dateTime  '../@OrderDate',
prodID int '@ProductID',
Qty int '@Quantity'
)
exec sp_xml_removedocument @idoc
/*XML查询结果*/
--OrderID CustomerID OrderData   prodID Qty
--10248 VINET 1996-07-04 00:00:00.000 11 12
--10248 VINET 1996-07-04 00:00:00.000 42 10
--10283 LILAS 1996-08-16 00:00:00.000 72 3


--C. 获得边缘表格式的结果
--以下示例中的示例 XML 文档由 元素组成。首先调用 sp_xml_preparedocument 以获得文档句柄。此文档句柄传递给 OPENXML。
--在 OPENXML 语句中,rowpattern (/ROOT/Customers) 标识要处理的 节点。由于未提供 WITH 子句,因此 OPENXML 以“边缘”表格式返回行集。
--最后,SELECT 语句检索“边缘”表中的所有列。
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='


               "1996-07-04T00:00:00">
     
     
   



               "1996-08-16T00:00:00">
     
   


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

你可能感兴趣的:(SQL读取XML数据函数)