XPath语法
程序员文章站
2022-05-26 20:11:04
...
在SQL Server 2005中,FOR XML 功能得到了增强,它有了对根元素和元素名称的新的选项、使用FOR XML 调用以便你可以建立复杂的层次关系的能力、和一个新的使得你可以定义将要使用XPath 语法来提取的XML结构的PATH 模式,如下面的示例所示: SELECT ProductID
在SQL Server 2005中,FOR XML 功能得到了增强,它有了对根元素和元素名称的新的选项、使用FOR XML 调用以便你可以建立复杂的层次关系的能力、和一个新的使得你可以定义将要使用XPath 语法来提取的XML结构的PATH 模式,如下面的示例所示:SELECT ProductID AS '@ProductID',
ProductName AS 'ProductName'
FROM Products
FOR XML PATH ('Product'), ROOT ('Products')
这个查询返回下面的XML:
除了增强SQL Server 2000已推出的XML功能,SQL Server 2005增加了一个新的、本地的xml 数据类型,使得你可以为XML数据创建变量和列,如下面的示例所示:
CREATE XML SCHEMA COLLECTION ProductSchema AS
'
你可以使用xml 数据类型来存储数据库中的文档或数据。列和变量可以用于非类型化的XML或类型化的XML,后者是对一个XML Schema 定义(XML Schema Definition ,XSD)的schema有效。如果要为数据验证进行定义,开发人员可以使用CREATE XML SCHEMA COLLECTION 语句,如下面的示例所示:
在创建了一个schema 集合后,你可以通过参照schema集合将一个xml变量或列与它所包含的schema 声明结合起来,如下面的示例所示:
CREATE TABLE SalesOrders
(OrderID integer PRIMARY KEY,
OrderDate datetime,
CustomerID integer,
OrderNotes xml)
类型化XML在插入值或更新值时对关联的schema 集合的声明进行验证,这使得可以为了遵从性检查或兼容性原因而加强关于XML数据的结构的业务规则。
XML 数据类型还提供了一些方法,使得你可以使用它们来查询和操纵实例的XML数据。例如,你可以使用query 方法来查询xml 数据类型的一个实例的XML数据,如下面的示例所示: [table][tr][td]declare @x xml
set @x=
'
SELECT @x.query(
'
{
for $invoice in /Invoices/Invoice
return $invoice/Customer
}
这个例子中的查询使用了一个XQuery 表达式,这个表达式找出文档中的每一个Invoice 元素,并返回一个包含每一个Invoice 元素的Customer元素的XML文档,如下面的示例所示:
SQL Server 2005中的另外一个显著的与XML相关的特性是对XML索引的支持。你可以为类型化xml的列创建首要和次要的XML索引来增强XML查询性能,一个首要的XML索引是一个XML实例的所有节点的部分表示,查询处理器可以使用它来快速的找到一个XML值中的节点。在你创建了一个首要的XML索引之后,你可以创建次要的XML索引来提高特定的查询类型的性能。下面的示例创建了一个首要的XML索引,和一个PATH类型的次要XML索引,它可以提高使用XPath表达式来标识一个XML实例中的节点的查询的性能。
CREATE PRIMARY XML INDEX idx_xml_Notes
ON SalesOrders (Notes)
GO
CREATE XML INDEX idx_xml_Path_Notes
ON SalesOrders (Notes)
USING XML INDEX idx_xml_Notes
FOR PATH
GO
SELECT ProductID AS '@ProductID', ProductName AS 'ProductName' FROM Products FOR XML PATH ('Product'), ROOT ('Products')
CREATE XML SCHEMA COLLECTION ProductSchema AS '?? '
CREATE TABLE SalesOrders (OrderID integer PRIMARY KEY, OrderDate datetime, CustomerID integer, OrderNotes xml)
declare @x xml set @x= '' SELECT @x.query( ' ?? Kim Abercrombie ??? ? - ? ?
- ? ?
- ??
?? Margaret Smith ??? ? - ??
{ for $invoice in /Invoices/Invoice return $invoice/Customer } ')
CREATE PRIMARY XML INDEX idx_xml_Notes ON SalesOrders (Notes) GO CREATE XML INDEX idx_xml_Path_Notes ON SalesOrders (Notes) USING XML INDEX idx_xml_Notes FOR PATH GO