SQLServer2005的的XML支持、异常处理以及更多内容支持、异常处理以及更多内容
北京火龙果软件工程技术中心
下载本文的代码: DataPoints05.exe (116KB)
SQL Server 2005 包括对 Transact-SQL (T-SQL) 语言的几项重要改进。新增功能之一是一种新的触发器,它在数据定义语言
(DDL) 语句运行时激发。在跟踪或保护数据库对象的创建和修改,或对数据库服务器进行更改时,DDL 触发器非常有用。另
一个新功能涉及异常处理,该功能因因包含 TRY/CATCH 块而在异常处理方面向前飞跃了一大步。另一组新功能则以新的
XML 数据类型为中心,该数据类型在与 SQL Server 交互的企业应用程序中管理 XML 数据方面前进了一大部。现在,XML 文
档或片段可以存储于 XML 列、绑定到架构、还可以利用 XQuery 语法查询。本月,我将解答读者发送给我的关于这些主题的
三个有趣的问题。
问:类型化和非类型化 XML 列各自的优势是什么?
答:非类型化 XML 列可以存储所有格式规范的 XML 片段或文档,而类型化 XML 列可以绑定到 XML 架构。如果不确定 XML
将遵循哪个架构,则非类型化 XML 很有用。例如,如果您必须使用另一个应用程序的某些 XML,但无法确定数据将遵循哪个
XML 架构,则可以使用非类型化 XML 列来执行这项工作。当然,非类型化 XML 也会带来其他问题。例如,不能针对某个架
构编程,因此很难有效地使用 XML。但有时无法避免非类型化 XML。创建非类型化 XML 列非常简单,如下所示:
CREATE TABLE Foo(FooID INT, someXml XML)
架构不绑定到 XML 列的另一个结果是,SQL Server? 2005 会将非类型化 XML 作为一个字符串存储。这是件好事还是坏事?
实际上,既是好事也是坏事。将 XML 作为字符串存储使您可以更灵活地存储任何 XML 片段或文档。根据应用程序的业务规
则,您可能需要这种方式。另一方面,将 XML 作为字符串存储意味着,与类型化 XML 相比,既不能有效地存储也不能有效
地搜索 XML 数据。并且既不会告诉 SQL Server XML 将包含哪些内容,也不会告诉它层次结构和 XML 节点的数据类型。但
请记住,仅仅因为这些是非类型化 XML 列并不意味着它们可以接受您设计出的任何格式。类型化和非类型化 XML 列仍然只
接受格式规范的 XML。
如果您要存储架构已知的 XML 文档,类型化 XML 列很理想。架构可以定义元素、属性、它们的数据类型、需要哪些字段以
及数据的整个层次结构。由于这种详细信息有关 XML 列的数据,因此 SQL Server 2005 可以在内部更加有效地存储 XML 数
据。如果您尝试存储与架构不匹配的 XML 数据,则 SQL Server 会检测到这一点并阻止您。
创建类型化 XML 列就像在括号中添加架构名称一样简单,如下所示:
CREATE TABLE Foo(FooID INT, someXml XML(CONTENT FooSchema))
该语句指出 someXml 列必须遵循名为 FooSchema 的 XML 架构集合。通过分别包含相应的关键字 DOCUMENT 或
CONTENT,XML 可指定为必须是一个文档或者可以包含一个片段。如果省略,则默认值为 CONTENT。
可以使用 T-SQL 命令将 XML 架构集合添加到数据库中,如下所示:
CREATE XML SCHEMA COLLECTION [FooSchema] AS N 'put your schema here'
也可以使用 SQL Server Management Studio (SSMS) 创建 XML 架构集合模板。从 View 菜单打开 Template Explorer,然后
导航到 XML Schema Collections 节点并展开它。然后,您可以双击 CREATE 模板打开一个模板,该模板为您创建 XML 架构
集合提供了一个良好的语法开端(参见图 1)。
图图 1 XML 架构集合模板是架构集合模板是 SSMS
SQL Server 2005 随附的 AdventureWorks 数据库有一个名为 HumanResources.JobCandidate 的表。该表包含一个名为
Resume 的列,该列是一个绑定到架构集合 HumanResources.HRResumeSchemaCollection 的 XML 列。该列中存储的所有
XML 数据都必须遵循该架构。图 2 展示该架构的关系图。