5XMLWhitePaperChs文档格式.docx
《5XMLWhitePaperChs文档格式.docx》由会员分享,可在线阅读,更多相关《5XMLWhitePaperChs文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
本文档中提及的真实的公司和产品名称可能是其各自所有者的商标。
目录
简介1
SQLServerXML功能的演变1
SQLServer2000中的XML功能1
SQLServer2005中的XML功能2
SQLServer2008中的XML功能4
XML架构验证增强功能4
Lax验证支持5
完全的xs:
dateTime支持6
Union和List类型6
XQuery增强功能8
XMLDML增强功能9
结束语10
导言
Microsoft使用FOR
XML和OPENXMLTransact-SQL关键字在MicrosoftSQLServer2000中引入了XML的相关功能,这使开发人员可以编写Transact-SQL代码将查询结果作为XML流进行检索,并将XML文档拆分到行集中。
通过引入支持XSD架构验证、基于XQuery的操作和XML索引的本机xml数据类型,SQLServer2005显著地扩展了其XML的功能。
SQLServer2008在以前版本中XML功能的基础上对其进行了改进,以应对客户在数据库中存储和操作XML数据时面临的挑战。
SQLServerXML功能的演变
SQLServer的XML功能随着SQLServer2000及其后续每个版本的发布不断演变。
在介绍SQLServer2008中的增强功能之前,概述以前版本中XML功能的演变很有用。
SQLServer2000中的XML功能
在SQLServer2000中,Microsoft引入了FORXML和OPENXMLTransact-SQL关键字。
FORXML是SELECT语句的扩展,它返回的查询结果是XML流,如下面的示例所示。
SELECTProductID,ProductName
FROMProductsProduct
FORXMLAUTO
此次查询返回一个XML片段,如下面的示例所示。
<
ProductProductID="
1"
ProductName="
Widget"
/>
2"
Sprocket"
OPENXML功能通过从XML文档中创建行集的方法执行与FORXML语句相反的功能,如下面的示例所示。
DECLARE@docnvarchar(1000)
SET@doc='
OrderOrderID="
1011"
>
<
ItemProductID="
Quantity="
<
/Order>
'
DECLARE@xmlDocinteger
EXECsp_xml_preparedocument@xmlDocOUTPUT,@doc
SELECT*FROM
OPENXML(@xmlDoc,'
Order/Item'
1)
WITH
(OrderIDinteger'
../@OrderID'
ProductIDinteger,
Quantityinteger)
EXECsp_xml_removedocument@xmlDoc
注意,使用sp_xml_preparedocument和sp_xml_removedocument存储过程为XML文档创建节点树的内存表示。
这段Transact-SQL代码返回如下行集。
OrderID
ProductID
Quantity
1011
1
2
SQLServer2005中的XML功能
在SQLServer2005中,FORXML功能新增了根元素和元素名称的新选项,增强了嵌套FORXML调用的能力,因此可以构建复杂的层次结构,新增的PATH模式允许定义使用Xpath语法进行检索的XML结构,如下面的示例所示。
SELECTProductIDAS'
@ProductID'
ProductNameAS'
ProductName'
FROMProducts
FORXMLPATH('
Product'
),ROOT('
Products'
)
此次查询返回如下XML。
Products>
ProductName>
Widget<
/ProductName>
<
/Product>
Sprocket<
/Products>
除了增强了SQLServer2000中的现有XML功能,SQLServer2005还添加了一种新的、本地xml数据类型,此数据类型能够用于为XML数据创建变量和列,如下面的示例所示。
CREATETABLESalesOrders
(OrderIDintegerPRIMARYKEY,
OrderDatedatetime,
CustomerIDinteger,
OrderNotesxml)
可以使用xml数据类型存储数据库中的标记文档或半结构化数据。
列和变量可以用于非类型XML和类型XML,其中后者是由XML架构定义(XSD)架构验证的。
开发人员可以使用CREATEXMLSCHEMACOLLECTION语句为数据验证定义架构,如下面的示例所示。
CREATEXMLSCHEMACOLLECTIONProductSchemaAS
?
xmlversion="
1.0"
encoding="
UTF-16"
xs:
schemaxmlns:
xs="
http:
//www.w3.org/2001/XMLSchema"
!
--schemadeclarationsgohere-->
/xs:
schema>
创建架构集合后,可以通过引用该架构集合并使用其包含的架构声明关联xml变量或列,如下面的示例所示。
OrderNotesxml(ProductSchema))
在插入或更新值时,相关架构集合中的声明将验证类型XML,出于符合或兼容性原因,有可能强制实施XML数据结构的业务规则。
xml数据类型也提供了一些方法,这些方法可以用于在实例中查询和操纵XML数据。
例如,可以在xml数据类型的实例中使用query方法查询XML,如下面的示例所示。
declare@xxml
set@x=
Invoices>
Invoice>
Customer>
KimAbercrombie<
/Customer>
Items>
Price="
1.99"
/>
3"
2.99"
5"
/Items>
/Invoice>
MargaretSmith<
/Invoices>
SELECT@x.query(
CustomerList>
{
for$invoicein/Invoices/Invoice
return$invoice/Customer
}
/CustomerList>
这个例子中的查询使用了用于在文档中查找每个Invoice元素的XQuery表达式,并且从每个Invoice元素返回包含Customer元素的XML文档,如下面的示例所示。
另一个在SQLServer2005中引入的与XML相关的显著功能是支持XML索引。
为了增强XML的查询功能,可以为类型xml列创建主XML索引和辅助XML索引。
主XML索引是XML实例中所有节点的细化表示,查询处理器可以使用它快速查找XML值中的节点。
创建主XML索引后,可以创建辅助XML索引改善特定查询类型的性能。
下面的例子就是创建主XML索引和类型PATH的辅助XML索引,这可以改善使用XPath表达式识别XML实例中节点的查询性能。
CREATEPRIMARYXMLINDEXidx_xml_Notes
ONSalesOrders(Notes)
GO
CREATEXMLINDEXidx_xml_Path_Notes
USINGXMLINDEXidx_xml_Notes
FORPATH
SQLServer2008中的XML功能
在SQLServer2000和SQLServer2005中引入的XML功能,在SQLServer2008中得到了进一步增强。
SQLServer2008中与XML相关的主要增强功能包括:
∙改进了架构验证功能
∙增强了对XQuery的支持
∙增强了执行XML数据操作语言(DML)插入的功能
本文的其余内容将详细介绍这些增强功能,并演示如何使用它们在SQLServer2008中实施更好的XML解决方案。
XML架构验证增强功能
可以通过强制实施与一个或几个XSD架构符合的方法验证XML数据。
架构为特定XML数据结构定义许可的XML元素和属性,并通常用于确保包括所有所需数据元素的XML文档使用正确的结构。
SQLServer2005通过使用XML架构集合引入了XML数据验证。
一般的方法是通过使用CREATEXMLSCHEMACOLLECTION语句创建一个包含XML数据架构规则的架构集合,然后在定义xml列或变量时,引用架构集合的名称,这些xml列或变量必须符合架构集合中的架构规则。
这样,SQLServer就会验证在架构集合的列或变量中插入或更新的、违反架构声明的任何数据。
SQLServer2005中的XML架构支持实现完整的XML规范的大子集,并且包含了大多数通用的XML验证场景。
SQLServer2008扩展了该支持,使其包括以下已经由用户标识的附加架构验证要求:
∙支持lax验证
∙完全支持dateTime、time和date验证,包括时区信息保护
∙改进了对union和list类型的支持
Lax验证支持
XML架构通过any、anyAttribute和anyType声明支持XML文档中的通配符部分。
complexTypename="
Order"
mixed="
true"
sequence>
elementname="
CustomerName"
OrderTotal"
anynamespace="
##other"
processContents="
skip"
minOccurs="
0"
maxOccurs="
unbounded"
complexType>
此架构声明定义了一个命名为Order的XML元素,该元素必须包括命名为CustomerName和OrderTotal的子元素。
此外,该元素还可以包含不限数量的其他元素,但这些元素应与Order类型属于不同的命名空间。
下面的XML显示了一个包含使用此架构声明定义的Order元素实例的XML文档。
注意:
Order中还包含一个没有在架构中显式定义的shp:
Delivery元素。
Invoicexmlns="
//adventure-
xmlns:
shp="
Order>
CustomerName>
GraemeMalcolm<
/CustomerName>
OrderTotal>
299.99<
/OrderTotal>
shp:
Delivery>
Express<
/shp:
验证通配符部分依赖于架构定义中通配符部分的processContents属性。
在SQLServer2005中,架构可以对any和anyAttribute声明使用skip和strict的processContents值。
在前面的例子中,通配符元素的processContents属性已经设置为skip,因此没有尝试验证元素的内容。
尽管架构集合包括对shp:
Delivery元素的声明(例如,定义一个有效传递方法列表),但该元素仍然是未验证的,除非在Order元素的通配符声明中将processContents属性设置为strict。
SQLServer2008添加了对第三个验证选项的支持。
通过将通配符部分的processContents属性设置为lax,可以对任何含有与它们相关架构声明的元素强制实施验证,但是忽略任何在架构中未定义的元素。
继续前面的例子,如果将架构中通配符元素声明的declaration属性设置为lax,并为shp:
Delivery元素添加一个声明,则在XML文档中的shp:
Delivery元素将被验证。
然而,如果替换shp:
Delivery元素,则文档就包含一个在架构中未定义的元素,此元素将被忽略。
此外,XML架构规范定义了anyType声明,该声明包含anyType内容模式的lax处理。
SQLServer2005不支持lax处理,因此anyType内容会被严格验证。
SQLServer2008支持anyType内容的lax处理,因此该内容会被正确验证。
dateTime支持
可以使用XML架构中的dateTime数据类型定义日期和时间数据。
日期时间数据表达式的格式为2007-08-01T09:
30:
00:
000Z,这表示协调通用时间(UTC)的2007年8月1日上午9点30分,UTC可由Z看出。
其他时区通过与UTC之间的时差表示,例如太平洋标准时间(比UTC时间晚8小时)2007年12月25日早晨6点可以表示为值2007-12-25T06:
000-8:
00。
XML架构规范将dateTime、date和time数据的时区组件定义为可选项。
但在SQLServer2005中,则必须为dateTime、time和date数据提供时区。
另外,SQLServer2005不保留dateTime或time数据的时区信息,而是将其规范化为UTC(例如,如果XML中包含值2007-12-25T06:
00,则SQLServer2005将其规范化为2007-12-25T14:
000Z。
)SQLServer2008删除了这些限制,因此在存储dateTime、date或time数据时可以省略时区信息,并且提供的任何时区信息都将保留。
Union和List类型
通过使用XML架构,可以为允许将值的有限集分配到多值元素和属性的XML数据定义数据类型。
例如,可以将限制可能值(可以赋给产品定义中AvaliableSizes元素的值)列表的sizeListType类型定义为S、M和L。
SQLServer2005支持包含这些简单类型定义和限制的XML架构。
例如,可以使用list类型定义产品的有效大小,如下面的示例所示。
simpleTypename="
sizeListType"
list>
simpleType>
restrictionbase="
string"
enumerationvalue="
S"
M"
L"
restriction>
这个架构声明可用于创建一个能够列出可购买产品中所有大小的元素,该元素列表的值之间用空格隔开,如下面的示例所示:
AvailableSizes>
SML<
/AvailableSizes>
然而,如何支持表达产品大小的两种不同方式呢?
例如,假设一个自行车设备零销商销售大、中和小号自行车服,同时也销售自行车,并使用与框架大小(如18、20、22和24)相关的数字区分自行车的尺寸。
为了满足这个需求,SQLServer2008添加了包含list类型的union类型支持,union类型可用于将多个LIST类型定义和限制合并为一个类型。
例如,以下Transact-SQL代码创建了一个已定义productSizeType类型的XML架构集合,此productSizeType类型中的有效值包含数字大小(18、20、22和24)的列表和已命名大小(S、M和L)的列表。
CREATEXMLSCHEMACOLLECTIONCatalogSizeSchemaAS
N'
productSizeType"
union>
<
integer"
<
18"
20"
22"
24"
有了架构中的这个声明,基于productSizeType的任何元素都能够包含这两种列表中的任何一种;
下面例子中的两种产品元素都是productSizeType数据类型的有效实例。
Catalog>
Product>
RoadBike<
2224<
ProductN