前家公司用到过没想到很快又遇到这问题了 那就照搬吧 不一样的地方也就表名与字段名
现在数据表需要用到排序功能,正好跟之前排序功能一样 干脆照搬一下前人写的代码觉得以后还会继续用到 就留着吧
期间也是用到一级 二级排序功能
USE [IstudyMMMMMMM] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[HobbyTypeOrder] AS BEGIN --处理一级类型内部排序 UPDATE dbo.S_HobbyType SET innerOrderID = X.innerOrderID FROM S_HobbyType JOIN (SELECT T.TypeID,T.TypeName,T.level,T.ParentID, ROW_NUMBER() OVER (ORDER BY T.innerOrderID) innerOrderID FROM dbo.S_HobbyType T WHERE T.level = 1) X ON X.TypeID = S_HobbyType.TypeID; --处理二级类型内部排序 UPDATE dbo.S_HobbyType SET innerOrderID = X.innerOrderID FROM S_HobbyType JOIN (SELECT T.TypeID,T.TypeName,T.level,T.ParentID, ROW_NUMBER() OVER (PARTITION BY T.ParentID ORDER BY T.innerOrderID) innerOrderID FROM dbo.S_HobbyType T WHERE T.level = 2) X ON X.TypeID = S_HobbyType.TypeID; --处理全局排序号 WITH CET AS ( SELECT L.TypeID,l.ParentID,L.level, dbo.CalcTreeNodeOrder(9,1024,level,InnerOrderID, NULL) GlobalOrder FROM dbo.S_HobbyType L WHERE level = 1 UNION ALL SELECT L.TypeID,L.ParentID,L.level, dbo.CalcTreeNodeOrder(9,1024,L.level,L.InnerOrderID,CET.GlobalOrder) GlobalOrder FROM dbo.S_HobbyType L JOIN CET ON L.ParentID = CET.TypeID ) UPDATE dbo.S_HobbyType SET GlobalOrderID = X.GlobalOrderID FROM S_HobbyType JOIN (SELECT TypeID,ROW_NUMBER() OVER (ORDER BY CET.GlobalOrder) GlobalOrderID FROM CET) X ON X.TypeID = dbo.S_HobbyType.TypeID; END
CalcTreeNodeOrder:
SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER FUNCTION [dbo].[CalcTreeNodeOrder] ( @MaxLevel SMALLINT, @MaxCount BIGINT, @CurLeval SMALLINT, @CurOrder BIGINT, @PrtOrder VARBINARY(8000) ) RETURNS VARBINARY(8000) AS BEGIN DECLARE @LevelByteLength INT = LOG(@MaxCount) / LOG(256) + 1 DECLARE @RESULT VARBINARY(8000) = NULL --设置父级节点信息 IF @CurLeval > 1 BEGIN SET @RESULT = SUBSTRING(@PrtOrder,1,(@CurLeval - 1) * @LevelByteLength) + CASE @LevelByteLength WHEN 1 THEN CONVERT(VARBINARY(1),@CurOrder) WHEN 2 THEN CONVERT(VARBINARY(2),@CurOrder) WHEN 3 THEN CONVERT(VARBINARY(3),@CurOrder) WHEN 4 THEN CONVERT(VARBINARY(4),@CurOrder) WHEN 5 THEN CONVERT(VARBINARY(5),@CurOrder) WHEN 6 THEN CONVERT(VARBINARY(6),@CurOrder) WHEN 7 THEN CONVERT(VARBINARY(7),@CurOrder) WHEN 8 THEN CONVERT(VARBINARY(8),@CurOrder) END END ELSE SET @RESULT = CASE @LevelByteLength WHEN 1 THEN CONVERT(VARBINARY(1),@CurOrder) WHEN 2 THEN CONVERT(VARBINARY(2),@CurOrder) WHEN 3 THEN CONVERT(VARBINARY(3),@CurOrder) WHEN 4 THEN CONVERT(VARBINARY(4),@CurOrder) WHEN 5 THEN CONVERT(VARBINARY(5),@CurOrder) WHEN 6 THEN CONVERT(VARBINARY(6),@CurOrder) WHEN 7 THEN CONVERT(VARBINARY(7),@CurOrder) WHEN 8 THEN CONVERT(VARBINARY(8),@CurOrder) END WHILE @CurLeval < @MaxLevel BEGIN SELECT @RESULT = @RESULT + CASE @LevelByteLength WHEN 1 THEN 0x00 WHEN 2 THEN 0x0000 WHEN 3 THEN 0x000000 WHEN 4 THEN 0x00000000 WHEN 5 THEN 0x0000000000 WHEN 6 THEN 0x000000000000 WHEN 7 THEN 0x00000000000000 WHEN 8 THEN 0x0000000000000000 END,@CurLeval = @CurLeval + 1 END RETURN @RESULT END GO