贯通SQL Server 2008数据库系统开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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