对 XML 列创建了全文索引后,下面的查询将检查 XML 值是否在书的标题中包含“custom”一词:
复制代码
SELECT * FROM T WHERE CONTAINS(xCol,'custom') AND xCol.exist('/book/title/text()[contains(.,"custom")]') =1
contains() 方法使用全文索引来将文档中任何位置包含“custom”一词的 XML 值组合为一个子集。exist() 子句确保“custom”一词出现在书的标题中。
使用 contains() 的全文搜索与 XQuery contains() 具有不同语义。后者是子字符串匹配,前者是使用词干匹配的标记匹配。因此,如果搜索标题中包含“run”的字符串,则匹配结果将包括“run”、 “runs”和“running”,因为同时满足全文 contains() 和 Xquery contains()。但是,查询不匹配标题中的“customizable”一词,因为全文 contains() 失败,而满足 Xquery contains()。通常,对于纯子字符串匹配,应删除全文 contains() 子句。
此外,全文搜索使用词干匹配,而 XQuery contains() 是文字匹配。这一区别在下一个示例中进行说明。
示例:使用词干匹配对 XML 值进行全文搜索
通常不能消除上一个示例中执行的 XQuery contains() 检查。请看下面的查询:
复制代码
SELECT * FROM T WHERE CONTAINS(xCol,'run')
因为使用了词干匹配,所以文档中的“ran”一词匹配搜索条件。此外,不通过使用 XQuery 来检查搜索上下文。
当通过使用 AXSD 将 XML 分解为全文索引的关系列时,对 XML 视图执行的 XPath 查询不对基础表执行全文搜索。
属性提升
如果主要是对少数元素和属性值进行查询,您可能希望将那些数量提升到关系列。检索整个 XML 实例,但只对一小部分 XML 数据进行查询时,这很有用。不必对 XML 列创建 XML 索引。但可以对提升的列创建索引。必须编写查询来使用提升的列。也就是说,查询优化器不会将对 XML 列的查询再定向到提升的列。
提升的列可以是同一个表中的计算列,也可以是表中用户维护的单独列。从每个 XML 实例提升单一值时,这就足够了。但是,对于多值属性,则必须为属性创建单独的表,如以下部分所述。
基于 xml 数据类型的计算列
可以使用调用 xml 数据类型方法的用户定义函数来创建计算列。计算列的类型可以是任何 SQL 类型,包括 XML。下面的示例说明了这一点。
示例:基于 xml 数据类型方法的计算列
为书的 ISBN 号创建用户定义函数:
复制代码
CREATE FUNCTION udf_get_book_ISBN (@xData xml)RETURNS varchar(20)BEGIN DECLARE @ISBN varchar(20) SELECT @ISBN = @xData.value('/book[1]/@ISBN', 'varchar(20)') RETURN @ISBN END
在表中为 ISBN 添加计算列:
复制代码
ALTER TABLE TADD ISBN AS dbo.udf_get_book_ISBN(xCol)
可以按通常的方式对计算列创建索引。
示例:对基于 xml 数据类型方法的计算列的查询
若要获得其 ISBN 为 0-7356-1588-2 的 <book>:
复制代码
SELECT xColFROM TWHERE xCol.exist('/book/@ISBN[. = "0-7356-1588-2"]') = 1
可以重新编写对 XML 列的查询以使用计算列,如下所示:
复制代码
SELECT xColFROM TWHERE ISBN = '0-7356-1588-2'
您可以创建返回 xml 数据类型的用户定义函数,并使用用户定义函数来创建计算列。但是,不能对 XML 计算列创建 XML 索引。
创建属性表
您可能希望将 XML 数据中的某些多值属性提升到一个或多个表中,对那些表创建索引,并再次定向查询以使用这些表。典型的情况是少数属性占了大部分查询工作负荷。您可以执行下列操作:
创建一个或多个表来保存多值属性。您会发现可以很方便做到:每个表存储一个属性,以及在属性表中复制基表的主键以便与基表进行后向联接。
如果希望维护属性的相对顺序,必须为相对顺序引入一个单独的列。
为 XML 列创建触发器以维护属性表。在触发器中,执行下列操作之一:
使用 xml 数据类型方法(如 nodes() 和 value())来插入和删除属性表的行。
在公共语言运行时 (CLR) 中创建流式表值函数来插入和删除属性表的行。
编写对属性表进行 SQL 访问的查询和对基表中的 XML 列进行 XML 访问的查询,这些表之间通过主键联接起来。
示例:创建属性表
为了进行说明,假定您希望提升作者的名字。书有一个或多个作者,因此名字为多值属性。每个名字都存储在属性表的单独行中。在属性表中复制基表的主键以便进行后向联接。
复制代码
create table tblPropAuthor (propPK int, propAuthor varchar(max))
示例:创建用户定义函数以从 XML 实例生成行集
以下表值函数 udf_XML2Table 接受主键值和 XML 实例。它检索 <book> 元素的所有作者的名字,然后返回主键-名字对行集。
799

被折叠的 条评论
为什么被折叠?



