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

使用以特性为中心的映射。
在某些情况下,可以将它与XML_ELEMENTS组合使用。使用时首先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。

2

使用以元素为中心的映射。
在某些情况下,可以将它与XML_ATTRIBUTES组合使用。使用时先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。

8

可与XML_ATTRIBUTESXML_ELEMENTS组合使用(逻辑OR)。
在检索的上下文中,该标志指明不应将已消耗的数据复制到溢出属性@mp:xmltext

 

SchemaDeclaration

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

ColName

是行集中的列名。

ColType

是行集中列的SQL数据类型。如果列类型不同于特性的基础XML数据类型,那么将发生类型压制。如果列的类型是TIMESTAMP,则当从OPENXML行集中进行选择时,将忽略XML文档中现有的值并返回自动填充值。

ColPattern

是可选的通用XPath模式,它说明应如何将XML节点映射到列。如果没有指定ColPattern,那么发生默认的映射(由flags指定的以特性为中心或以元素为中心的映射)。

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

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

MetaProperty

是由OPENXML提供的元属性之一。如果指定元属性,则该列包含元属性提供的信息。这些元属性使您得以析取XML节点的信息(如相对位置、命名空间信息),以提供比文本化表示法更详细的信息。

TableName

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

通过使用SchemaDeclaration或者指定一个现有的TableNameWITH子句提供一种行集格式(根据需要还提供其它映射信息)。如果没有指定可选的WITH子句,那么以edge table格式返回结果。边缘表在单个表中表示XML文档的细密结构(例如,元素/特性名、文档层次结构、命名空间、PI等)。

下表描述边缘表的结构。

列名

数据类型

描述

id

bigint

是文档节点的唯一ID

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

parentid

bigint

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

如果节点位于XML文档的顶层,则其ParentIDNULL

nodetype

int

标识节点类型。是对应于XML DOM节点类型编号的整数(有关节点信息,请参见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.使用带有OPENXMLSELECT语句

下面的示例使用sp_xml_preparedocument创建XML图像的内部表示。然后对XML文档的内部表示法执行使用OPENXML行集提供程序的SELECT语句。

flag值设置为1,表示以特性为中心的映射。因此,XML特性映射到行集中的列。指定为/ROOT/Customersrowpattern标识要处理的<Customers>节点。

没有指定可选的colpattern(列模式),因为列名和XML特性名称匹配。

OPENXML行集提供程序创建了一个双列行集(CustomerIDContactName),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文档中两个CustomerCustomerIDContactName的值都作为NULL返回。

下面是结果集:

CustomerID ContactName
---------- -----------
NULL      NULL
NULL      NULL
 
B.为列和XML特性之间的映射指定ColPattern

下面的查询从XML文档返回客户ID、订单日期、产品ID和数量等特性。rowpattern标识<OrderDetail>元素。ProductIDQuantity<OrderDetails>元素的特性。而CustomerIDOrderDate是父元素(<Orders>)的特性。

TAG:

 

评分:0

我来说两句

日历

« 2024-04-10  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 24709
  • 日志数: 49
  • 建立时间: 2008-02-23
  • 更新时间: 2009-10-13

RSS订阅

Open Toolbar