OpenXml() 会创建内存中的表示形式
,并使用工作表而不是查询处理器
。它依赖于 MSXML 3.0 的 XPath 1.0 处理器而不是 XQuery 引擎
。工作表不在对 OpenXml() 的多个调用中共享(即使是在同一个 XML 实例上)。这限制了它的可伸缩性。在未指定 WITH 子句时
,可以通过 OpenXml() 来访问 XML 数据的边缘表格式。而且,还可以通过它使用 XML 值在单独的"溢出"列中的剩余部分。
nodes() 和 value() 函数的组合可以有效地使用 XML 索引。因此,这一组合可以表现出比 OpenXml 更高的可伸缩性。
使用 FOR XML 从行集中生成 XML
通过新的 TYPE 指令,可以使用 FOR XML 从行集中生成 XML 数据类型实例。
可以将结果赋给 XML 数据类型列、变量或参数。而且,可以将 FOR XML 嵌套以便生成任意层次结构。这使得嵌套的 FOR XML 比 FOR XML EXPLICIT 更加便于编写,但是对于较深的层次结构,它的性能可能不太好。FOR XML 还引入了新的 PATH 模式,该模式指定列的值应该出现在 XML 树中的哪个路径。
可以使用新的 FOR XML TYPE 指令,通过
SQL 语法来定义关系数据上的只读 XML 视图。可以通过
SQL 语句和嵌入式 XQuery 来查询该视图,如下面的示例所示。例如,您可以在存储过程中引用此类 SQL 视图。
示例:返回生成的 XML 数据类型的 SQL 视图
下面的 SQL 视图定义可在一个关系列 (pk) 以及从一个 XML 列中检索到的书籍作者上创建一个 XML 视图:
CREATE VIEW V (xmlVal) AS
SELECT pk, xCol.query('/book/author')
FROM T
FOR XML AUTO, TYPE
视图 V 包含一个行,该行只有一个列:XML 类型的 xmlValtype。可以像查询常规的 XML 数据类型实例那样查询它。例如,下面的查询将返回名字为"David"的作者:
SELECT xmlVal.query('//author[first-name = "David"]')
FROM V
SQL 视图定义在某种程度上类似于使用带有批注的架构创建的 XML 视图。然而,二者之间存在重要的区别。SQL 视图定义是只读的,并且必须通过嵌入式 XQuery 来操作;而使用带有批注的架构的 XML 视图则不是这样。而且,SQL 视图在应用 XQuery 表达式之前生成 XML 结果,而 XML 视图上的 XPath 查询在基础表上计算 SQL 查询。
添加业务逻辑
可以用多种方式将业务逻辑添加到 XML 数据中:
• 您可以编写行或列约束,在插入和修改 XML 数据的过程中实施特定于域的约束。
• 您可以在 XML 列上编写相应的触发器,使其当您在该列中插入或更新值时引发。该触发器可以包含特定于域的验证规则,或者填充属性表。
• 可以使用
托管代码编写 SQLCLR 函数并向其传递 XML 值,并且使用由 System.Xml 命名
空间提供的 XML 处理功能。这方面的一个例子是将 XSL 转换应用于 XML 数据,如下所示。您还可以将 XML 反序列化为一个或多个
托管类,并且使用托管代码来操作它们。
• 您可以编写 T-SQL 存储过程和函数,激活 XML 列上的处理以满足您的业务需要。
示例:应用 XSL 转换
考虑 CLR 函数 TransformXml(),它接受一个 XML 数据类型实例和一个存储在文件中的 XSL 转换,将该转换应用于 XML 数据,并且在结果中返回转换后的 XML。用 C# 编写的主干函数如下所示: