存储过程 给表排序

前家公司用到过没想到很快又遇到这问题了 那就照搬吧 不一样的地方也就表名与字段名

现在数据表需要用到排序功能,正好跟之前排序功能一样 干脆照搬一下前人写的代码觉得以后还会继续用到 就留着吧

期间也是用到一级 二级排序功能

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
时间: 2024-11-15 08:13:18

存储过程 给表排序的相关文章

数据结构学习笔记06排序 (快速排序、表排序)

1.快速排序 不稳定 分而治之 找主元pivot,小于主元划分为一个子集,大于主元的划分为一个子集 然后进行递归 最好情况:每次主元正好中分,T(N) = O( NlogN ) 选主元 的方法有很多,这里用 取头.中.尾的中位数. 直接选A[0]为pivot,时间复杂度T ( N ) = O( N ) + T ( N–1 ) = O( N ) + O ( N–1 ) + T( N–2 ) = = O( N ) + O ( N–1 ) + …+ O( 1 ) = O( N^2 ) 随机取pivot

SQL SERVER 2008 存储过程传表参数

? 最近项目使用到了存储过程传入表类型参数. --定义表类型 create type t_table_type as table ( id int, name varchar(32), sex varchar(2) ) ? go --创建存储过程 CREATE PROC u_test (@t t_table_type readonly) as begin ???? select * from @t ???? end ? --调用存储过程 declare @t t_table_type ? ins

Oracle中存储过程传入表名学习

Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2) as --定义变量存放动态的SQL语句 dynamic_drop_sql varchar2(500); begin dynamic_drop_sql :=  'DELETE  FROM ' || i_tableName ; --执行动态SQL语句 execute immediate dynamic_drop

MySQL数据库存储过程动态表建立(PREPARE)

PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 这是我项目当中用到的,用作参考使用: DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`r

用存储过程 给表增加序列与触发器

存储过程如下: create or replace procedure p_createseq(tablename in varchar2,key in varchar2) Authid Current_User --使用角色权限,否则无法创建序列或表 is strsql varchar2(500); t_key varchar2(500); begin --创建序列 strsql:='create sequence seq_'||tablename|| ' minvalue 1000 maxv

数据结构--排序(上)--表排序

表排序 表排序排序的是一个元素很大的.移动元素的时间很长,所以移动指针. 间接排序 物理排序 N个数字的排列由若干个独立的环组成. 如何判断一个环的结束? 正确答案:每访问一个空位i后,就令table[i]=i.当发现table[i]== i  时,环就结束了. 物理排序过程的最好情况是 :顺序都是一样的,什么都不用做. 物理排序过程的最坏情况是 : 有N/2个环,每个环包含2个元素

排序之表排序、基数排序及所有排序算法比较

本学习笔记部分内容来自浙江大学网易云课堂,谢谢! 1.表排序 定义一个指针数组做为表.排序的时候,数组位置上的数值不变,改变的是指针的指向. 如该图,初始数值:f d c a g b h e   开始时,比较f>d,则指针0指向d,指针1指向f.之后比较f>c,d>c,则指针0指向c,指针1指向d,指针2指向f.以此类推,最终指针0指向a的位置(即table[0]=3,A[3]那个位置) 2.基数排序 基本思想:比如十进制数字排序,先按个位数大小排,再按十位数大小排,依次.举例如下: 基

[SQL]存储过程建表

create PROC [dbo].CreateUserTable ( @name NVARCHAR(60) ) AS DECLARE @a NVARCHAR(max) SET @a='create table '[email protected] +' ([id] [int] IDENTITY(1,1) NOT NULL' EXEC (@a) exec CreateUserTable 'zhou' [SQL]存储过程建表

模板模式--哈希表排序

#include <iostream> #include <string> #include <map> #include <vector> #include<algorithm> using namespace std; typedef pair<string,int>PAIR; bool cmp_by_value(const PAIR& p,const PAIR &a) { return p.second<a