`
Landroid
  • 浏览: 14322 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

上移下移等操作的通用存储过程

sql 
阅读更多
写在前面的废话:
忙着做项目,却好久没更新博客了。趁着今天想起,赶快写一篇。
----------------------------------------------------------

数据库:SQL Server 2008

实现的功能:

上移、下移、上移至N位、下移至N位(置顶和置底只需要在传参数的时候传递表的总记录数即可)
注意,此处的排序是修改N条记录的排序字段(我的业务逻辑需要,不考虑大数据量的修改)

数据库表设计
Menu表
MenuNumber 菜单序号 VARCHAR 6
OrderNum 排序编号 INTEGER



Use [数据库名]
GO
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_chartdb_menu_list' AND user_name(uid) = 'dbo')
	DROP PROCEDURE [dbo].proc_chartdb_menu_list
GO

CREATE  PROCEDURE  proc_chartdb_menu_list		--创建存储过程
 (
 @Sign int = 0,					-- 0: 上移 1:下移
 @MoveNum int = 1,				-- 移动位数
 @TableName nvarchar(50),		-- 表名
 @ItemName nvarchar(50),		-- 主键字段名
 @ItemID varchar(12),			-- 主键ID值
 @SortName nvarchar(50),		-- 排序ID名称
 @TypeName nvarchar(50)='',		-- 条件字段名
 @TypeValue nvarchar(50)= ''	-- 条件值
 )
 AS

 BEGIN
     SET NOCOUNT ON
 
     DECLARE 
         @SQL nvarchar(4000),
         @ThisSort int,					-- 当前排序ID
         @PREVID varchar(12),			-- 前一个主键ID
         @NextID varchar(12),			-- 后一个主键ID
         @Count int = 0,				-- 计数
         @TempV varchar(12) = '0'		-- 临时变量
    --添加事务,并指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
	BEGIN TRAN A
	--排序操作
     WHILE (@MoveNum > 0)
     BEGIN
		 IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id=object_id('tempdb.dbo.#tempTab')) 
		 BEGIN
			DROP TABLE #tempTab
		 END
     --临时索引表--
     CREATE TABLE #tempTab
     (
		 RowNum int,
         ItemID varchar(12),
         Sort int
     )
     --将表中主键和排序字段的值插入到临时表中
     SET @SQL = 'INSERT INTO #tempTab (RowNum,ItemID,Sort) SELECT Row,'+@ItemName+ ','+ @SortName +' FROM (SELECT ROW_NUMBER() OVER (ORDER BY '+@SortName+' ASC)AS Row ,'
				+@ItemName+ ','+ @SortName +' FROM '+ @TableName +') AS TEMPTABLE'
	 
     IF (@TypeName<>'' AND @TypeValue<>'') SET @SQL = @SQL +' WHERE '+ @TypeName +'='+ @TypeValue
     --SET @SQL = @SQL +' ORDER BY '+@SortName+' ASC '
     EXEC(@SQL)
     SET @SQL = ''
		 SELECT @Count = COUNT(*) FROM #tempTab
		 SELECT @ThisSort = RowNum FROM #tempTab WHERE ItemID = @ItemID
		 IF(@ThisSort>1) SELECT @PREVID = ItemID FROM #tempTab WHERE RowNum=(@ThisSort-1)
		 IF(@ThisSort<@Count) SELECT @NextID = ItemID FROM #tempTab WHERE RowNum=(@ThisSort+1)
	     
		 IF(@Sign=0)
			 BEGIN
				 IF(@ThisSort>1)
				 BEGIN
					 SELECT @TempV = Sort from #tempTab where ItemID = @PREVID
					 SET @SQL = 'UPDATE '+ @TableName +' SET '+ @SortName+ '='+ CONVERT(varchar(100),@TempV) +' WHERE '+ @ItemName +' = '+ CONVERT(varchar(100),@ItemID)  + ';'
					 SELECT @TempV = Sort from #tempTab where ItemID = @ItemID
					 SET @SQL = @SQL + 'UPDATE '+ @TableName +' SET '+ @SortName +'='+ CONVERT(varchar(100),@TempV) +' WHERE '+ @ItemName +' = '+ CONVERT(varchar(100),@PREVID)
	                 
				 END
			 END
		 ELSE
			 BEGIN
				 IF(@ThisSort<@Count)
				 BEGIN
					SELECT @TempV = Sort from #tempTab where ItemID = @NextID
					 SET @SQL = 'UPDATE '+ @TableName+ ' SET '+ @SortName+ '='+ CONVERT(varchar(100),(@TempV)) +' WHERE '+ @ItemName +' = '+ CONVERT(varchar(100),@ItemID)   +';'
					 SELECT @TempV = Sort from #tempTab where ItemID = @ItemID
					 SET @SQL = @SQL + 'UPDATE '+ @TableName +' SET '+ @SortName +'='+ CONVERT(varchar(100),@TempV) +' WHERE '+ @ItemName +' = '+ CONVERT(varchar(100),@NextID)
				 END
			 END
	 
		 EXEC(@SQL)
		 SET @MoveNum = @MoveNum-1
	END
	COMMIT TRAN A
 END
 
 go
 --执行 存储过程名 
 --参数1:(0,上移;1,下移),
 --参数2:移动位数
 --参数3:表名
 --参数4:主键名
 --参数5:主键值
 --参数6:排序字段名
 --参数7:条件字段名
 --参数8:条件值                  
 exec proc_chartdb_menu_list 1, 3, 'dbo.Menu', 'MenuNumber','121', 'OrderNum', '', ''
 
 Go	
 SELECT * FROM Menu Order by OrderNum



执行计划中,主要在插入临时表和排序中,开销较大。存储过程没有进行优化(实际上是自己目前精力和能力有限)
存储过程中包含17个查询,4个更新,1个插入,有操作可能会重复执行。

开销最大的部分是 循环体 部分,重复的创建临时表,插入、更新等。

欢迎交流和提出改进方法

-----
修改:
添加了事务锁

说明:

以下内容参考网上方法,进行改进,不是100%的原创。
分享到:
评论

相关推荐

    mysql常用的上移下移存储过程实现

    项目开发中列表展示页面涉及到一些条目的上下移动 ,由于数据量大时,服务端代码比较耗时, 所以我使用mysql 存储过程完成上下移动,比较通用方法,欢迎大家下载学习,共同进步

    vb_Treeview节点上下左右移动.rar_VB树节点功能_adventurehpj_vb treeview_vb tree

    - `Mod_GUID.bas`:这是一个标准模块,可能包含了通用的函数和过程,比如生成全局唯一标识符(GUID)的代码,可能在创建新节点时用到。 - `VB6_Treeview节点移动.exe`:这是可执行文件,可以直接运行查看和测试VB ...

    VB通用listview里面可以拖动Item上下

    标题“VB通用listview里面可以拖动Item上下”揭示了一个功能扩展,允许用户通过鼠标操作将ListView中的Item上移或下移,这增强了用户的交互体验并提供了更灵活的数据管理方式。 在描述中提到,这个功能实现包括了几...

    ODBC API 开发教程.pdf

    它提供了多种光标类型,包括滚动光标和非滚动光标,允许开发者以前进、后退、上移、下移的方式浏览查询结果集。同时,ODBC支持事务处理,提供了一致性和隔离性的保证。 此外,ODBC API支持存储过程的执行和参数的...

    Java写的绘图工具源代码

    这样可以独立操作每个图层,实现隐藏、显示、上移、下移等功能。 7. 调色板和样式选择:提供用户选择颜色、线条样式、填充模式等功能,这通常需要自定义组件或使用现有的Swing组件。 8. 文件保存和加载:为了保存...

    信捷触屏使用说明书

    多屏一机功能使得用户能够在同一台设备上操作多个屏幕,提高工作效率。 **6.2 实现步骤** - 设计适用于多屏一机的工作界面,包括不同屏幕间的切换机制。 - 实现屏幕间的通信协议,确保数据能够流畅传输。 - 测试多...

    linux基本知识及与Win的区别,vi基本操作

    - **移动光标:** `h` (左移),`j` (下移),`k` (上移),`l` (右移)。 - **删除文本:** `x` (删除光标所在字符),`dd` (删除整行)。 - **复制文本:** `yy` (复制整行)。 - **粘贴文本:** `p` (粘贴到光标后)...

    R2008S 防爆型 无源压力单点记录仪使用说明书.doc

    4. 上移键/下移键:在设置参数时调整数值的增减。 5. 设置键:进入或修改仪表参数。 6. 复位键:用于故障排除或数据清零。 七、软件使用和故障排除 20页之后的内容涵盖了如何使用管理软件进行数据分析,以及如何...

    单片机原理及应用课程设计报告.doc

    游戏设计要求在单片机实验箱的通用板上实现,使用液晶显示屏进行游戏显示,并通过键盘接收玩家输入。游戏应具备基本的俄罗斯方块玩法,包括不同形状的方块随机生成、自由落体、旋转、碰撞检测、消除行等功能。在游戏...

    图件管理系统-需求分析.doc

    由于经常会出现图层的相互覆盖问题,所以设置了图层的上移、下移、置顶和置底功能,以方便显示所有的图层。 4. 图件的查看和基本操作模块: (1) 图件的显示功能:本系统用工程来管理图件,用户既可以以工程的形式...

    三年模拟精选2016届高考物理专题八恒定电流全国通用

    3. **电容器的工作原理**:电容器存储电荷,其两端电压与存储的电荷量成正比,即Q=CU,其中Q是电荷量,C是电容,U是电压。在题目中,当开关S断开后,电容器C上的电荷量增加,表明电容两端电压上升。 4. **电阻分压...

    MySQL数据库架构演进分析.pdf

    在存储层面,从共享存储到通用和专用存储的发展,强调了实时性、安全性和容灾能力。异构数据冗余和可靠性保证则确保了数据的完整性和可用性。计算层面,数据库系统开始具备混合计算能力,融合OLAP(在线分析处理)和...

    折弯机数控系统e710ienter

    - **位置交换**:使用上移或下移键交换下模在列表中的位置。 - **新增下模**:在卡片中输入新下模的数据,保存后添加到列表。 - **删除下模**:选择下模后删除。 - **修改下模参数**:编辑已选中下模的参数。 #####...

    数据采集与特殊工况预警系统研究技术总结报告.pdf

    3. 通用文档模块功能设计方案:整合文档管理,便于存储、检索和共享相关资料。 4. 知识库模块功能设计方案:建立知识库,积累经验,支持决策制定和问题解决。 5. 系统管理菜单模块功能设计方案:包括用户管理、权限...

    C++版俄罗斯方块代码

    在实际操作中,你可能会遇到各种问题,如内存管理、效率优化等,这些都是C++程序员成长过程中宝贵的锻炼机会。通过这个项目,你可以深入学习C++的类、对象、继承、多态等核心概念,以及如何利用C++的库来增强你的...

    俄罗斯方块的c++程序

    C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它以其高效性和灵活性在软件开发领域占据重要地位。 在实现俄罗斯方块的过程中,我们首先需要定义...

    使用Idea的一些快捷键

    - **Alt+Shift+Up/Down**:上/下移一行。将当前行与上/下行交换位置。 - **Shift+F6**:重构—重命名。可以安全地重命名变量、方法等,并更新所有相关引用。 - **Ctrl+X**:删除行。 - **Ctrl+D**:复制行。 - **...

    俄罗斯方块控制台代码

    2. **数据结构**:为了存储和操作游戏中的方块,开发者可能会使用数组或者自定义的数据结构。例如,每个方块可以用二维数组表示,数组的每个元素代表一个方块的小方格。同时,还需要一个队列来存储即将出现的方块...

    金融行业新IT架构分析.docx

    建设银行自主研发了一套全面自动化的云管理平台,实现了服务器安装、版本部署等一系列自动化操作,极大提升了数据中心运营管理的自动化水平。 - **优点**:提高运营效率,降低人工错误。 #### 结论 建设银行通过这...

Global site tag (gtag.js) - Google Analytics