OPENXML
上一篇 / 下一篇 2009-07-31 10:36:34 / 个人分类:SQL相关
OPENXML
OPENXML通过XML文档提供行集视图。由于OPENXML是行集提供程序,因此可在会出现行集提供程序(如表、视图或OPENROWSET函数)的Transact-SQL语句中使用OPENXML。
语法
OPENXML(idocint[in],rowpatternnvarchar[in],[flagsbyte[in]])
[WITH (SchemaDeclaration|TableName)]
参数
idoc
是XML文档的内部表式法的文档句柄。通过调用sp_xml_preparedocument创建XML文档的内部表式法。
rowpattern
是XPath模式,用来标识要作为行处理的节点(这些节点在XML文档中,该文档的句柄由idoc参数传递)。
flags
表示应在XML数据和关系行集间使用映射以及应如何填充溢出列。flag为可选输入参数,可以是下列值之一。
字节值 |
|
0 | 默认为以特性为中心的映射。 |
1 | 使用以特性为中心的映射。 |
2 | 使用以元素为中心的映射。 |
8 | 可与XML_ATTRIBUTES或XML_ELEMENTS组合使用(逻辑OR)。 |
SchemaDeclaration
是窗体的架构定义:
ColNameColType[ColPattern | MetaProperty][,ColNameColType[ColPattern|MetaProperty]...]
ColName
是行集中的列名。
ColType
是行集中列的SQL数据类型。如果列类型不同于特性的基础XML数据类型,那么将发生类型压制。如果列的类型是TIMESTAMP,则当从OPENXML行集中进行选择时,将忽略XML文档中现有的值并返回自动填充值。
ColPattern
是可选的通用XPath模式,它说明应如何将XML节点映射到列。如果没有指定ColPattern,那么发生默认的映射(由flags指定的以特性为中心或以元素为中心的映射)。
指定为ColPattern的XPath模式用于指定特殊的映射性质(如果发生以特性为中心和以元素为中心的映射),这些特殊的映射性质可以重写或增强由标志所指定的默认映射。
指定为ColPattern的通用XPath模式也支持元属性。
MetaProperty
是由OPENXML提供的元属性之一。如果指定元属性,则该列包含元属性提供的信息。这些元属性使您得以析取XML节点的信息(如相对位置、命名空间信息),以提供比文本化表示法更详细的信息。
TableName
如果具有期望架构的表已经存在且不要求列模式,则为给定的表名(而不是SchemaDeclaration)。
通过使用SchemaDeclaration或者指定一个现有的TableName,WITH子句提供一种行集格式(根据需要还提供其它映射信息)。如果没有指定可选的WITH子句,那么以edge table格式返回结果。边缘表在单个表中表示XML文档的细密结构(例如,元素/特性名、文档层次结构、命名空间、PI等)。
下表描述边缘表的结构。
列名 | 数据类型 | 描述 |
id | bigint | 是文档节点的唯一ID。 根元素的ID值为0。保留负ID值。 |
parentid | bigint | 标识节点的父节点。此ID所标识的父节点不一定是父元素,而是取决于此ID所标识节点的子节点的NodeType。例如,如果节点是文本节点,则其父节点可能是特性节点。 如果节点位于XML文档的顶层,则其ParentID为NULL。 |
nodetype | int | 标识节点类型。是对应于XML DOM节点类型编号的整数(有关节点信息,请参见DOM)。 三种节点类型是: 1=元素节点 |
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/Customers的rowpattern标识要处理的<Customers>节点。
没有指定可选的colpattern(列模式),因为列名和XML特性名称匹配。
OPENXML行集提供程序创建了一个双列行集(CustomerID和ContactName),SELECT语句从该行集中检索必要的列(在本例中检索所有的列)。
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc =
<ROOT>
<Customer CustomerID=\"VINET\" ContactName=\"Paul Henriot\">
<Order CustomerID=\"VINET\" EmployeeID=\"5\" rderDate=\"1996-07-04T00:00:00\">
<OrderDetail rderID=\"10248\" ProductID=\"11\" Quantity=\"12\"/>
<OrderDetail rderID=\"10248\" ProductID=\"42\" Quantity=\"10\"/>
</Order>
</Customer>
<Customer CustomerID=\"LILAS\" ContactName=\"Carlos Gonzlez\">
<Order CustomerID=\"LILAS\" EmployeeID=\"3\" rderDate=\"1996-08-16T00:00:00\">
<OrderDetail rderID=\"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))
下面是结果集:
CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez
如果将flags设置为2(表示以元素为中心的映射)并执行相同的SELECT语句,由于<Customers>元素没有任何子元素,则对于XML文档中两个Customer的CustomerID和ContactName的值都作为NULL返回。
下面是结果集:
CustomerID ContactName
---------- -----------
NULL NULL
NULL NULL
B.为列和XML特性之间的映射指定ColPattern
下面的查询从XML文档返回客户ID、订单日期、产品ID和数量等特性。rowpattern标识<OrderDetail>元素。ProductID和Quantity是<OrderDetails>元素的特性。而CustomerID和OrderDate是父元素(<Orders>)的特性。
TAG: