写在前面的废话:
忙着做项目,却好久没更新博客了。趁着今天想起,赶快写一篇。
----------------------------------------------------------
数据库: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 存储过程完成上下移动,比较通用方法,欢迎大家下载学习,共同进步
- `Mod_GUID.bas`:这是一个标准模块,可能包含了通用的函数和过程,比如生成全局唯一标识符(GUID)的代码,可能在创建新节点时用到。 - `VB6_Treeview节点移动.exe`:这是可执行文件,可以直接运行查看和测试VB ...
标题“VB通用listview里面可以拖动Item上下”揭示了一个功能扩展,允许用户通过鼠标操作将ListView中的Item上移或下移,这增强了用户的交互体验并提供了更灵活的数据管理方式。 在描述中提到,这个功能实现包括了几...
它提供了多种光标类型,包括滚动光标和非滚动光标,允许开发者以前进、后退、上移、下移的方式浏览查询结果集。同时,ODBC支持事务处理,提供了一致性和隔离性的保证。 此外,ODBC API支持存储过程的执行和参数的...
这样可以独立操作每个图层,实现隐藏、显示、上移、下移等功能。 7. 调色板和样式选择:提供用户选择颜色、线条样式、填充模式等功能,这通常需要自定义组件或使用现有的Swing组件。 8. 文件保存和加载:为了保存...
多屏一机功能使得用户能够在同一台设备上操作多个屏幕,提高工作效率。 **6.2 实现步骤** - 设计适用于多屏一机的工作界面,包括不同屏幕间的切换机制。 - 实现屏幕间的通信协议,确保数据能够流畅传输。 - 测试多...
- **移动光标:** `h` (左移),`j` (下移),`k` (上移),`l` (右移)。 - **删除文本:** `x` (删除光标所在字符),`dd` (删除整行)。 - **复制文本:** `yy` (复制整行)。 - **粘贴文本:** `p` (粘贴到光标后)...
4. 上移键/下移键:在设置参数时调整数值的增减。 5. 设置键:进入或修改仪表参数。 6. 复位键:用于故障排除或数据清零。 七、软件使用和故障排除 20页之后的内容涵盖了如何使用管理软件进行数据分析,以及如何...
游戏设计要求在单片机实验箱的通用板上实现,使用液晶显示屏进行游戏显示,并通过键盘接收玩家输入。游戏应具备基本的俄罗斯方块玩法,包括不同形状的方块随机生成、自由落体、旋转、碰撞检测、消除行等功能。在游戏...
由于经常会出现图层的相互覆盖问题,所以设置了图层的上移、下移、置顶和置底功能,以方便显示所有的图层。 4. 图件的查看和基本操作模块: (1) 图件的显示功能:本系统用工程来管理图件,用户既可以以工程的形式...
3. **电容器的工作原理**:电容器存储电荷,其两端电压与存储的电荷量成正比,即Q=CU,其中Q是电荷量,C是电容,U是电压。在题目中,当开关S断开后,电容器C上的电荷量增加,表明电容两端电压上升。 4. **电阻分压...
在存储层面,从共享存储到通用和专用存储的发展,强调了实时性、安全性和容灾能力。异构数据冗余和可靠性保证则确保了数据的完整性和可用性。计算层面,数据库系统开始具备混合计算能力,融合OLAP(在线分析处理)和...
- **位置交换**:使用上移或下移键交换下模在列表中的位置。 - **新增下模**:在卡片中输入新下模的数据,保存后添加到列表。 - **删除下模**:选择下模后删除。 - **修改下模参数**:编辑已选中下模的参数。 #####...
3. 通用文档模块功能设计方案:整合文档管理,便于存储、检索和共享相关资料。 4. 知识库模块功能设计方案:建立知识库,积累经验,支持决策制定和问题解决。 5. 系统管理菜单模块功能设计方案:包括用户管理、权限...
在实际操作中,你可能会遇到各种问题,如内存管理、效率优化等,这些都是C++程序员成长过程中宝贵的锻炼机会。通过这个项目,你可以深入学习C++的类、对象、继承、多态等核心概念,以及如何利用C++的库来增强你的...
C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它以其高效性和灵活性在软件开发领域占据重要地位。 在实现俄罗斯方块的过程中,我们首先需要定义...
- **Alt+Shift+Up/Down**:上/下移一行。将当前行与上/下行交换位置。 - **Shift+F6**:重构—重命名。可以安全地重命名变量、方法等,并更新所有相关引用。 - **Ctrl+X**:删除行。 - **Ctrl+D**:复制行。 - **...
2. **数据结构**:为了存储和操作游戏中的方块,开发者可能会使用数组或者自定义的数据结构。例如,每个方块可以用二维数组表示,数组的每个元素代表一个方块的小方格。同时,还需要一个队列来存储即将出现的方块...
建设银行自主研发了一套全面自动化的云管理平台,实现了服务器安装、版本部署等一系列自动化操作,极大提升了数据中心运营管理的自动化水平。 - **优点**:提高运营效率,降低人工错误。 #### 结论 建设银行通过这...