下一页 1 2 3 4 5 6
本文基于 Microsoft SQL Server 代号“Yukon”的 Beta 1 版本,文中所有信息都有可能发生变化。 下载本文的代码:UDTsinYukon.exe (112KB) 注:本文是在产品投放生产之前编写的,因此,我们无法保证此处包含的任何细节都与在交付使用的产品中发现的细节完全一致。文中信息描述的是本文发布之时的产品,仅供规划之用。这些信息可在任何时候更改,恕不预先通知。
用户定义类型 (UDT) 是 SQL Server? 下一个版本(代号“Yukon”)中新的公共语言运行库 (CLR) 的集成功能之一。Yukon 中的 UDT 标志着自 SQL Server 以前版本以来一个显著的进步。例如,SQL Server 2000 支持别名类型,可以为用户提供一种重新定义本机类型的简单方法。别名类型是使用现有数据类型创建的,现有数据类型在多个位置(表、过程等)以相同的方式定义。例如,一个邮政编码可能在多个表中使用,并作为多个存储过程中的一个参数。可以用如下方法创建一个名为 ZIP 的类型: 接下来便可以在任何需要邮政编码的地方使用 ZIP,而不是 char(5) NOT NULL,并且也不必担心与同样存储邮政编码的其他表中的其他字段保持一致的问题。注意 ZIP 上有一个附加的约束 — NOT NULL。这一约束强制字段必须有一个值,因此使用该类型将不允许空值。您可以创建规则和默认对象并将它们绑定到别名类型,从而进一步地实施和维护数据完整性。例如,可以创建一个只允许数字值的规则并将其绑定到 ZIP 类型。这一技术有强大的设计和实现优势,例如更有组织的以及更一致的数据结构将产生更一致的数据。 在 Yukon 中,系统存储过程 sp_addtype 被新的数据描述语言 (DDL) 语法 CREATE TYPE 所替代。前面的例子可以写成下面这样: Yukon UDT 允许用户编写 Microsoft .NET 框架类,这些框架类能够在 SQL 语言类型系统中注册为标量类型。这使得 Yukon UDT 与任何其他 SQL 本机类型地位相同。Yukon UDT 被编译成能够在数据库内部注册并存储的 .NET 程序集。一旦程序集存储到数据库中,用户能够使用 CREATE TYPE 语句的扩展将该程序集中的类定义为类型,相关内容将在本文的后面详细阐述。要让一个 .NET 框架类作为 SQL 类型系统中的类型,它必须实现一个协定 — 一组接口和方法,在 CREATE TYPE 时由 Yukon 进行验证。定义和实现 .NET 程序集中定义的 UDT 能够进行更为灵活的类型设计,不仅可以存储结构化的类型,而且还允许自定义方法、属性以及数据的序列化。 该功能有几个优点。它是扩展数据库标量类型系统的一个强有力的方法。这一可扩展性机制非常健壮,您可以使用它在数据库中存储类型的实例,以及在许多上下文中运行它们(作为变量、存储过程的参数以及函数的值),并在几乎所有能够使用本机类型的地方使用它们,包括诸如复制、大量复制、分布式查询和跨数据库操作之类的高级场景中。另外,您可以将定义在类型上的行为作为查询的一部分来调用,甚至能对调用这种行为的结果建立索引以加速查询的执行。 UDT 的另一个优点是封装。类型的状态以及在类型上的操作常常可作为一个单元来使用。类型上的方法控制对状态的访问,使您能够自由地使用熟悉的 OO 范例来考虑类型,并产生其他应用程序开发人员能够使用的可重用组件。在本文的后面,我将讨论用 .NET 代码实现 UDT 的各种方面,以及在 Yukon 中使用结果类作为数据类型的问题。 Yukon UDT 可以作为不透明或者抽象数据类型,因为类型的使用者不了解类型执行的内部细节。他们仅通过类型的公共接口与类型进行交互。这一定义 UDT 的新技术为数据库设计开启了新的大门。既然 UDT 可以是具有属性、方法等的托管类型,那么您现在可以创建类型来代表大量以前在 SQL Server 中没有的数据结构。使用 UDT,您能够创建代表地理空间(位置和地图类型的数据)、自定义二进制数据、编码数据以及加密数据的数据结构。 您可以使用实现 UDT 协定的托管代码来创建一个类,从而扩展 SQL 类型系统。接下来使用 CREATE ASSEMBLY 语句将包含 UDT 的已编译程序集加载到服务器上的数据库中,并使用公开托管代码 UDT 的 CREATE TYPE 语句在数据库中创建类型。 这时,您可以在表定义或变量声明中使用该类型。让我们从检查 UDT 托管代码需求开始。
不透明或抽象类型
创建程序集
类属性
比较 UDT 的值
为空性
支持的转换
其他要求
在 SQL Server 中使用 UDT 创建程序集
创建类型
使用 UDT
删除和更改 UDT 以及程序集
小结 EXEC sp_addtype ZIP, 'CHAR(5)', 'NOT NULL'
CREATE TYPE ZIP FROM char(5) NOT NULL
不透明或抽象类型