托管 UDT 使您能够扩展 SQL Server 的类型系统
2007-11-11 04:48:09 来源:WEB开发网比较 UDT 的值
在执行二进制比较时,IsByteOrdered 属性将影响到 sql server(WINDOWS平台上强大的数据库平台) 如何使用 UDT 的实例。换句话说,如果 IsByteOrdered 为 false,那么 UDT 的二进制表示形式不可与另外的值相比较。这意味着作为该 UDT 定义的字段不能参与需要进行比较的操作,例如排序和索引。由于该字段不能在索引中使用,因而它不能是主键或者唯一键,这继而意味着它不具有参照完整性。该字段也不能用于 ORDER BY、GROUP BY 或者 PARTITION BY 子句。
当 IsByteOrdered 为 true 时,sql server(WINDOWS平台上强大的数据库平台) 无需创建 UDT 的托管实例即可在所有的比较中使用该 UDT 的二进制表示形式。这将允许我前面提到过的功能及其他功能,包括可索引、主键和外键、检查和唯一约束、ORDER BY、GROUP BY 和 PARTITION BY 子句、顺序比较以及比较运算符。
如果您的 UDT 需要这些功能中的任何一种,则必需把 IsByteOrdered 设置为 true。但是,需要注意的一点是,只有当 UDT 的设计者能够保证序列化的二进制数据完全与信息的语义顺序相同时才能将 IsByteOrdered 设置为 true。为了更好地理解这一点,让我们来看一个例子。
如果 Point 类代表空间中的一点,X 和 Y(二者都定义为 Int32)是它仅有的属性,它能够作为二进制排序的候选吗? 换句话说,能够认为其中任何一个 Point 小于或大于另外一个 Point 吗? 例如,将 PointA (4, -1) 与 PointB (2, 3) 进行比较,其中哪个更大呢? 对于该问题没有一个简单的答案,正如没有一个简单的方法来存储二进制数据以反映这一顺序一样。因此,Point 不是一个能够实现二进制排序的类。
Yukon 只有在 UDT 值的序列化表示形式已经是二进制排序时,才支持在其值上使用比较运算符(以及依赖于比较支持的相关功能,如 GROUP BY 和 ORDER BY)。UDT 的设计者通过在类型定义中将 IsByteOrdered 设置为 true 来表明序列化表示形式具有此属性。同样,数据的二进制表示形式的排序必须与类型的语义排序等价。换句话说,在序列化字节上执行比较操作产生的结果与在托管代码中执行比较的结果相同。
应该注意的是,在本机格式中,如果设置了该属性,sql server(WINDOWS平台上强大的数据库平台) 将保证二进制表示形式是可比较的。在 UserDefined 格式中,选取一个具有该属性的规范化算法是开发人员的责任。并且,三种序列化格式都支持等于 (=) 以及不等于 (!=) 比较运算符。Native 和 UserDefined 序列化格式另外还支持大于 (>)、小于 (<)、大于或等于 (>=) 以及小于或等于 (<=) 比较运算符。
为空性
尽管所有的 Yukon UDT 都识别空值,然而为了让 UDT 能够将空值接受为一个有效值,类必须实现 INullable 接口。这将由以下语句完成:
// C#public class MyClass: INullable' Visual Basic .NETPublic Class MyClassImplements INullable
INullable 包含一个唯一的属性 IsNull,因而类必须这样实现:
// C#public bool IsNull{get {return is_Null;}}' Visual Basic .NETPublic ReadOnly Property IsNull() As Boolean Implements INullable.IsNullGetReturn (is_Null)End GetEnd Property
is_Null 变量是私有变量,并保存实例的空状态。最后,类必须拥有一个名为 Null 的静态属性,以返回 UDT 的一个空值实例。如果实例确实为空,将允许 UDT 返回一个空值,如图 3 中的代码所示。
更多精彩
赞助商链接