SQL Server 2008 亮点
SQL Server 2008 提供的日期/时间格式
变动的精确数可以节省空间
时间与日期分开,在利用 between and 取间隔时可方便许多
旧的时间函数可以使用新的数据型态,提供新的时间函数以取得更精确的时间
数据表型态的参数
可以先定义数据表 Type,再宣告该型态的变量
CREATE TYPE mytab AS TABLE (id int);
DECLARE @t mytab;
传递数据表型态的参数是只读的
T-SQL 语法增强
可以一行指令同时宣告变量与初始化值
DECLARE @i int = 4
DECLARE @i INT=2SELECT TOP 3 @i*=@i FROM sys.objectsSELECT @i
SELECT Country,TitleOfCourtesy,COUNT(EmployeeID) 汇总结果 FROM Employees GROUP BY Grouping Sets(Country,TitleOfCourtesy,(Country,TitleOfCourtesy))Order By Country DESC,TitleOfCourtesy
CREATE TABLE tbSource(C1 INT PRIMARY KEY,C2 NVARCHAR(10))GOINSERT tbSource VALUES(1,N'甲'),(2,N'乙')GOSELECT * INTO tbDest FROM tbSource DELETE tbSource WHERE c1=1UPDATE tbSource SET c2=N'乙2' WHERE C1=2INSERT tbSource VALUES(3,N'丙') MERGE tbDest D USING tbSource s ON D.c1 = S.c1 WHEN MATCHED THEN --修改 UPDATE SET D.c2 = S.c2 WHEN SOURCE NOT MATCHED THEN --删除 DELETE WHEN TARGET NOT MATCHED THEN --新增 INSERT VALUES(c1, c2) OUTPUT $action, INSERTED.c1 [New c1], INSERTED.c2 [New c2], DELETED.c1 [Original c1], DELETED.c2 [Original c2];
-- Step 1: 建立有阶层特征的数据表-- HierarchyID 可比较,因此可当作主键CREATE TABLE tbEmployee( OrgNode HierarchyID PRIMARY KEY CLUSTERED, OrgLevel AS OrgNode.GetLevel(), EmployeeID int UNIQUE NOT NULL, EmpName nvarchar(20) NOT NULL) ;GO -- Step 2: 建立 breadth-first 索引,也就是相同父亲的数据放在一起-- 以数值 OrgLevel 放在前面,然后才是结点CREATE UNIQUE INDEX EmployeeOrgNc1 ON tbEmployee(OrgLevel, OrgNode) ;GO -- Step 3: 加载数据-- 载入根结点INSERT tbEmployee(OrgNode, EmployeeID, EmpName)VALUES (hierarchyid::GetRoot(), 1, N'甲') ;GO SELECT OrgNode.ToString() [文字描述阶层], OrgNode, OrgLevel, EmployeeID, EmpNameFROM tbEmployee ;
--透过 GetDescendant 函数建立第一个子结点DECLARE @Manager hierarchyid SET @Manager = (SELECT OrgNode FROM tbEmployee WHERE EmployeeID = 1) --加入子结点,因为是第一个子结点,所以不需要算位置INSERT tbEmployee (OrgNode, EmployeeID, EmpName)VALUES(@Manager.GetDescendant(NULL, NULL), 12, N'乙') ; GO SELECT OrgNode.ToString() AS [文字描述阶层], OrgNode, OrgLevel, EmployeeID, EmpName FROM tbEmployee ;
-- Step 4: 建立新增节点的共享预存程序CREATE PROC AddEmp(@mgrid int, @empid int, @e_name nvarchar(20)) AS BEGIN -- mOrgNode 父节点 -- lc 该父节点的最后一个子结点 DECLARE @mOrgNode hierarchyid, @lc hierarchyid SELECT @mOrgNode = OrgNode FROM tbEmployee WHERE EmployeeID = @mgrid SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION SELECT @lc = max(OrgNode) FROM tbEmployee WHERE OrgNode.GetAncestor(1) =@mOrgNode ; --传回上一阶,相同父节点的最大子结点 INSERT tbEmployee(OrgNode, EmployeeID, EmpName) VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name) --将新增节点加在父节点最大的孩子旁 COMMITEND ;GO EXEC AddEmp 12, 121, N'丙';EXEC AddEmp 12, 122, N'丁';EXEC AddEmp 1, 13, N'戊';EXEC AddEmp 121, 1211, N'己';EXEC AddEmp 13, 131, N'庚';GO SELECT OrgNode.ToString() AS [文字描述阶层], OrgNode, OrgLevel, EmployeeID, SPACE(OrgNode.GetLevel()*5) + EmpNameFROM tbEmployee;