6,129
社区成员
发帖
与我相关
我的任务
分享
DECLARE @i int = 4
DECLARE @i INT=2
SELECT TOP 3 @i*=@i FROM sys.objects
SELECT @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))
GO
INSERT tbSource VALUES(1,N'甲'),(2,N'乙')
GO
SELECT * INTO tbDest FROM tbSource
DELETE tbSource WHERE c1=1
UPDATE tbSource SET c2=N'乙2' WHERE C1=2
INSERT 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, EmpName
FROM 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) --将新增节点加在父节点最大的孩子旁
COMMIT
END ;
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) + EmpName
FROM tbEmployee;
严重支持.