比较 UDT 的值
在执行二进制比较时,IsByteOrdered 属性将影响到 SQL Server 如何使用 UDT 的实例。换句话说,如果 IsByteOrdered 为 false,那么 UDT 的二进制表示形式不可与另外的值相比较。这意味着作为该 UDT 定义的字段不能参与需要进行比较的操作,例如排序和索引。由于该字段不能在索引中使用,因而它不能是主键或者唯一键,这继而意味着它不具有参照完整性。该字段也不能用于 ORDER BY、GROUP BY 或者 PARTITION BY 子句。当 IsByteOrdered 为 true 时,SQL Server 无需创建 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 将保证二进制表示形式是可比较的。在 UserDefined 格式中,选取一个具有该属性的规范化算法是开发人员的责任。并且,三种序列化格式都支持等于 (=) 以及不等于 (!=) 比较运算符。Native 和 UserDefined 序列化格式另外还支持大于 (>)、小于 (<)、大于或等于 (>=) 以及小于或等于 (<=) 比较运算符。
为空性
尽管所有的 Yukon UDT 都识别空值,然而为了让 UDT 能够将空值接受为一个有效值,类必须实现 INullable 接口。这将由以下语句完成:
// C# public class MyClass: INullable ' Visual Basic .NET Public Class MyClass Implements INullable
INullable 包含一个唯一的属性 IsNull,因而类必须这样实现:
// C#
public bool IsNull
{
get {return is_Null;}
}
' Visual Basic .NET
Public ReadOnly Property IsNull() As Boolean Implements INullable.IsNull
Get
Return (is_Null)
End Get
End Property
is_Null 变量是私有变量,并保存实例的空状态。最后,类必须拥有一个名为 Null 的静态属性,以返回 UDT 的一个空值实例。如果实例确实为空,将允许 UDT 返回一个空值,如图 3 中的代码所示。
相关专题
- 系统优化大全 (18003篇文章)
- 系统安全设置 (23411篇文章)
- 系统安装手册 (20723篇文章)
- 系统备份专题 (17449篇文章)
- SQL Server 数据处理专题 (1856篇文章)
- SQL Server 索引和查询专题 (3320篇文章)
- SQL Server (1813篇文章)
- 系统维护手册 (16836篇文章)
- SQL Server (1815篇文章)
- SQL Server连接中常见错误解决方法 (99次浏览)
- SQL Server的文件恢复技术 (6次浏览)
- 用SQL Server 2005实现WebService (0次浏览)
- 用NetBeans5.0连接SQL Server2005数据库 (0次浏览)
- 使用NetBeans5.0连接SQL Server 2005数据库 (0次浏览)
- 如何使用SQL Server 2000中的XML功能一 (0次浏览)
- 访谈:SQL Server Everywhere仅仅是另一种数据 (0次浏览)
- 地中海船运公司通过SQL Server2005处理5TB的数 (0次浏览)
- 从SQL Server 4.2到SQL Server 2005 (0次浏览)



