2.5 新的数据类型
Microsoft SQL Server 2008包括了我们可以开发的一些新的数据类型,这些数据类型包括DATE和TIME数据类型。同时也包括了HierarchyID系统数据类型。
在T-SQL中DATE和TIME数据类型允许按照你的需要仅仅只存储部分datetime数据类型。在Microsoft SQL Server的先前的版本中,存储和获取仅仅是日期和时间需要你同时存储日期和时间值,通过使用一个转化函数来去除不需要的部分。DATE 系统数据类型仅仅存储日期,并且 TIME系统数据类型仅仅存储时间。使用DATE和TIME系统数据类型就像使用datetime系统数据类型一样。
在例2-6中,使用新的数据类型声明了变量,并且简单地用getdate()函数的返回值设定了变量的值。time数据类型支持精确到7位的小数点位。
例2-6 新数据类型1
DECLARE @Dt as DATE, @Tm as TIME set @Dt = getdate() set @Tm = getdate() select @Dt, @Tm
在例2-7中,创建了一个表格,并使用date数据类型创建了一列。接着使用getdate()的值设置了一个默认的限制。当插入了一条记录并且查询了表格之后,可以看到DateAdded列的值为今天的日期。
例2-7 新数据类型2
CREATE TABLE dbo.Table 1 (RecordID int NOT NULL, ateAdded date NULL, DataValue nvarchar(MAX) NULL ) ON [PRIMARY] TEXTIMAGE ON [PRIMARY] GO ALTER TABLE dbo.Table 1 ADD CONSTRAINT DF Table 1 DateAdded DEFAULT getdate() FOR DateAdded GO INSERT INTO Table 1 (RecordID, DataValue) VALUES (1, 'test') GO SELECT * FROM Table 1 GO
在例2-8中,创建了同样的表格,但是没有默认的限制。当增加记录的时候我们只是简单地设置DateAdded列的值为getdate()系统函数的值。使用例2-7和例2-8的代码,输出结果将会是一样的。
例2-8 新数据类型3
CREATE TABLE dbo.Table 1 (RecordID int NOT NULL, DateAdded date NULL, DataValue nvarchar(MAX) NULL ) ON [PRIMARY] TEXTIMAGE ON [PRIMARY] GO INSERT INTO Table 1 (RecordID, DateAdded, DataValue) VALUES (1, getdate(), 'test') GO SELECT * FROM Table 1 GO
SQL Server 2008 新加入了一个第三日期系统数据类型。这个第三日期系统数据类型是datetime2。它就像已经使用了很多年的datetime数据类型一样,但是它要更加准确。datetime2数据类型精确到100ns(7位小数位)。当我们使用datetime2数据类型的时候,可以通过使用datetime2(n)选择要精确到的小数位,从0~7位。datetime2数据类型的值的设置方法与datetime的设置方法一致,如例2-9所示。
DECLARE @Dt as datetime2
例2-9 设置系统数据类型 datetime2
set @Dt = getdate() select @Dt
在例2-10中,显示了如何控制数据类型的精度(保留4位小数位)。
例2-10 控制数据类型的精度
DECLARE @Dt as datetime2(4) set @Dt = getdate() select @Dt
第四日期系统数据类型已经被加到了datetimeoffset系统数据类型中。这个数据类型在它的输出中包括了从GMT得来的时区偏移,如例2-11所示。
例2-11 新数据类型4
Declare @Dt as datetimeoffset(3) set @Dt = '2007-12-12 12:17:23.0 +7:00' Select @Dt
HierarchyID 系统数据类型,这个新的数据类型被最优化来显示数据树。HierarchyID数据类型支持两种策略来进行索引存储,即深度优先遍历和广度优先遍历。在深度优先遍历中,在一个单一树中的一些行在索引中被相互之间挨着存储。一个原始的图表类型数据,雇员和经理就是一个典型的例子。在广度优先遍历中,行被相互之间挨着存储。在雇员/经理例子中,向同样的经理汇报的雇员们被相互之间挨着存储。
对于HierarchyID数据类型,系统中有一些系统函数和方法与之相联系,如GetLevel()、ParentChildOrg()、DescendantLimit()和GetAncestor()。例2-12显示了一个简单的经理和雇员之间的父子关系的例子。
例2-12 经理和雇员之间的父子关系
CREATE TABLE Organization ( NodeLevel hierarchyid, EmployeeID int, OrgLevel as NodeLevel.GetLevel(), EmployeeName nvarchar(50) NOT NULL ) ; GO insert into Organization (NodeLevel, EmployeeID, EmployeeName) values (hierarchyid::GetRoot(),0, 'Bob') GO Declare @Manager hierarchyid SELECT @Manager = hierarchyid::GetRoot() FROM Organization insert into Organization (NodeLevel, EmployeeId, EmployeeName) values (@Manager.GetDescendant(null, null), 1, 'Joe') GO Declare @Manager hierarchyid declare @NodeLevel hierarchyid select @NodeLevel = NodeLevel from Organization where EmployeeName='Joe' SELECT @Manager = max(NodeLevel) FROM Organization where NodeLevel.GetAncestor(1) = @NodeLevel insert into Organization (NodeLevel, EmployeeID, EmployeeName) values @NodeLevel.GetDescendant(@Manager, null),2, 'Sarah') GO select NodeLevel.ToString()as NodeLevel String, * FROM Organization GO drop table Organization GO