主要提示:给需要排序的记录增加一个字段N_Order(N_Order值可以设置成该记录ID自增值),用于记录的排序序号。主要通过存储过程实现,但是我这里给出的算法不是最好的,比如置顶操作,可以把要置顶的记录的N_Order设置成最小的N_Order-1,其他记录的N_Order值就都不要变了。
/* @Table:kanfang360.FloorModel @Func: 手动设置楼号顺序N_Order @Author: Linc @Time: 2008.5.23 @PS: N_Order值越小越排前 */ CREATE proc kf.setFloorModelOrd @N_Order varchar(20),--排序号 @mode varchar(20), @id varchar(20), @s_out varchar(20) output AS declare @T_N_Order int, @tempOrder int, @tempID int, @preN_Order int,--上一记录的N_Order @nextN_Order int, @T_ID int set @T_N_Order=cast(@N_Order as int) set @T_ID=cast(@id as int) begin if(@mode='top')--置顶 begin --获取最小N_Order值 select @tempOrder=MIN(N_Order) from kanfang360.FloorModel --获取最小N_Order值 记录的ID select @tempID=[ID] from kanfang360.FloorModel where N_Order=@tempOrder --将原最小N_Order值 记录的N_Order+1 update kanfang360.FloorModel set N_Order=@tempOrder+1 where [ID]=@tempID --将要置顶的记录的N_Order值设置成最小N_Order值 update kanfang360.FloorModel set N_Order=@tempOrder where N_Order=@T_N_Order --除置顶和原最顶记录外,其他记录的N_Order值+1 update kanfang360.FloorModel set N_Order=N_Order+1 Where N_Order<>@tempOrder AND [ID]<>@tempID set @s_out='置顶成功' end--end top if(@mode='bottom')--置末 begin --获取最大N_Order值 select @tempOrder=MAX(N_Order) from kanfang360.FloorModel --获取最大N_Order值 记录的ID select @tempID=[ID] from kanfang360.FloorModel where N_Order=@tempOrder --将原最大N_Order值 记录的N_Order-1 update kanfang360.FloorModel set N_Order=@tempOrder-1 where [ID]=@tempID --将要置末的记录的N_Order值设置成最大N_Order值 update kanfang360.FloorModel set N_Order=@tempOrder where N_Order=@T_N_Order --除置末和原最末记录外,其他记录的N_Order值-1 update kanfang360.FloorModel set N_Order=N_Order-1 Where N_Order<>@tempOrder AND [ID]<>@tempID set @s_out=' 置末成功' end--end bottom if(@mode='up')--上移 begin --如果是最顶记录就自动退出 --获取最小N_Order值 select @tempOrder=MIN(N_Order) from kanfang360.FloorModel if(@tempOrder=@T_N_Order) begin set @s_out='记录已到顶!' return end --获取上一条记录N_Order select Top 1 @preN_Order=N_Order from kanfang360.FloorModel where N_Order<@N_Order order by N_Order desc --获取上一条 记录的ID select @tempID=[ID] from kanfang360.FloorModel where N_Order=@preN_Order --将上移记录的N_Order设置成上一条记录的N_Order update kanfang360.FloorModel set N_Order=@preN_Order where N_Order=@T_N_Order --将上一条记录的N_Order设置成要上移记录的N_Order update kanfang360.FloorModel set N_Order=@N_Order where [ID]=@tempID set @s_out=' 上移成功' end--end up if(@mode='down')--下移 begin --如果是最末记录就自动退出 select @tempOrder=MAX(N_Order) from kanfang360.FloorModel if(@tempOrder=@T_N_Order) begin set @s_out='记录已到底!' return end --获取下一条记录N_Order select Top 1 @nextN_Order=N_Order from kanfang360.FloorModel where N_Order>@N_Order order by N_Order --获取下一条 记录的ID select @tempID=[ID] from kanfang360.FloorModel where N_Order=@nextN_Order --将下移记录的N_Order设置成下一条记录的N_Order update kanfang360.FloorModel set N_Order=@nextN_Order where N_Order=@T_N_Order --将下一条记录的N_Order设置成要下移记录的N_Order update kanfang360.FloorModel set N_Order=@N_Order where [ID]=@tempID set @s_out='下移成功' end--end down /* @T_N_Order 要插入到此排序号前 4 @tempID 要插入到此排序号的ID 737 @T_ID 要操作的记录 的ID 731 @tempOrder 要操作记录的N_Order 1 */ --exec kf.setFloorModelOrd '3','insert','736','' if(@mode='insert')--插入 begin select @T_N_Order=N_Order from kanfang360.FloorModel where Floor_Code=@T_N_Order --获取要操作记录的N_Order select @tempOrder=N_Order from kanfang360.FloorModel where [ID]=@T_ID --获取插入到此排序号的ID select @tempID=[ID] from kanfang360.FloorModel where N_Order=@T_N_Order /* 插入必须分两种情况,一种是A插入B之前,A的N_Ooder >B的N_Ooder ;还有一种是A@T_N_Order) begin --获取上一条记录N_Order select Top 1 @preN_Order=N_Order from kanfang360.FloorModel where N_Order<@tempOrder order by N_Order desc if(@preN_Order=@T_N_Order)--如果上一条记录就是要插入到此排序号之前,则退出 begin set @s_out='无需插入1'; return end --执行插入操作 update kanfang360.FloorModel set N_Order=@T_N_Order where [ID]=@T_ID update kanfang360.FloorModel set N_Order=N_Order+1 where (N_Order>=@T_N_Order)AND(N_Order<@tempOrder)AND([ID]<>@T_ID) set @s_out='操作成功1'; end --select Top 1 N_Order from kanfang360.FloorModel where N_Order>1 order by N_Order else if(@tempOrder<@T_N_Order) begin --获取要操作记录的下一条记录的N_Order select Top 1 @nextN_Order=N_Order from kanfang360.FloorModel where N_Order>@tempOrder order by N_Order if(@nextN_Order=@T_N_Order)--如果下一条记录就是要插入到此排序号之前,则退出 begin set @s_out='无需插入2'; return end --执行插入操作 update kanfang360.FloorModel set N_Order=@T_N_Order-1 where [ID]=@T_ID update kanfang360.FloorModel set N_Order=N_Order-1 where (N_Order>=@tempOrder)AND(N_Order<@T_N_Order)AND([ID]<>@T_ID) set @s_out='操作成功2'; end else begin set @s_out='无需插入3'; return end end end