在做管理系统时,不可避免会要求对记录进行上下移动.
假如我们有一张表 t_test ,它的字段如下:
CREATETABLE[dbo].[t_test](
[sysid][bigint]NOTNULL,
[cname][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[position][int]NULL
)
其中的position用来表示记录排列次序。
首先,讨论一下移动一条记录的的SQL语句写法(为简化问题,只写了上移的语句):
逻辑写在注释里了,应该不难看明白。也就是找到前一条记录,跟当前记录交换一下即可。
然后,我们来看多条记录同时移动的方法,其实可以把上面的过程写进存储过程,然后在前台代码中用循环调用一下即可,如果我们要在SP中实现循环,也可以这样来做:
--传入参数,一个以‘,'分隔的字串
declare@idsnvarchar(20)
set@ids='2,4'
--以下为实现代码
declare@tmpnvarchar(128),@idxint,@startint,@numnvarchar(8)
declare@idbigint,@prebigint,@poldint
--Step1:找到第一个分隔符
set@tmp=@ids
set@idx=charindex(',',@tmp)
--Step2:循环每个切开的字串
while@idx<>0
begin
--Step2.1:切开一段
set@num=substring(@tmp,1,@idx-1)
set@tmp=substring(@tmp,@idx+1,len(@tmp)-@idx)
--print'num='+@num
set@idx=charindex(',',@tmp)
--按单条记录移动的方法处理(其实可以用调用另一个SP的方法实现)
set@id=convert(bigint,@num)
select@pre=sysid,@pold=positionfrom
(selectmax(b.position)asmfromt_testa,t_testbwherea.sysid=@idandb.position<a.position)t,t_testc
wherec.position=t.m
updatet_testsetposition=position+1wheresysid=@pre
updatet_testsetposition=casewhen@poldisNULLthen0else@poldendwheresysid=@id
end
--Step3:注意最后一段也要处理一下
--剩下的字串完整处理即可
set@num=substring(@tmp,1,len(@tmp))
--print'num='+@num
set@id=convert(bigint,@num)
select@pre=sysid,@pold=positionfrom
(selectmax(b.position)asmfromt_testa,t_testbwherea.sysid=@idandb.position<a.position)t,t_testc
wherec.position=t.m
updatet_testsetposition=position+1wheresysid=@pre
updatet_testsetposition=casewhen@poldisNULLthen0else@poldendwheresysid=@id
因为从页面上的checkbox传过来的参数,形式就是以逗号分隔的字串,所以如果直接再传给SP来处理,应该是比较方便的。
分享到:
相关推荐
使用MS SQL 实现的任意间隔的移动平均线,
中,可以利用触发器轻松实现历史记录功能。 在触发器中,需要用到 SQL Server 的 inserted 和 deleted 两个虚拟表,在执行 sql 命令时,这两个虚拟表分别记录的内容如下: sql命令 deleted inserted ------...
jsp+SQL实现分页,并且统计记录总数,实现上下分页,首页,尾页,
SQL 一些常用语句大全 sql查询重复记录方法大全
用sql实现js的unescape,方便做套打报表的朋友,自己刚写的,有问题请联系:94741441
用标准的SQL语句实现查询记录分页.txt
用SQL删除重复记录的N种方法 用SQL删除重复记录的N种方法
帐户表(帐号,姓名,余额,锁定) 业务需求: 1.两个帐号都要存在。 2.如果任何一方被锁定(锁定字段=1),则不能转。 3.转账方最低余额为10元。 3.要保证交易完整性。
很多用GROUPPING和ROLLUP来实现。 优点:实现代码简洁,要求对GROUPPING和ROLLUP很深的理解。 缺点:低版本的Sql Server不支持。2.游标实现。 优点:思路逻辑简洁。 缺点:复杂和低效。3.利用临时表。 优点:...
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录。本文将介绍利用使用表变量和游标实现数据库中表的遍历。 表变量来实现表的遍历 以下代码中,代码块之间的...
SQL查找某记录的前后N条数据 SQL查找某记录的前后N条记录
用SQL实现树的查询, 用SQL实现树的查询, 用SQL实现树的查询
linq to sql实现分层与gridview使用实现增删改,适合新手做三层项目开发,快速入门
课程设计Python+SQLServer实现疫情医疗信息管理系统源码课程设计Python+SQLServer实现疫情医疗信息管理系统源码课程设计Python+SQLServer实现疫情医疗信息管理系统源码课程设计Python+SQLServer实现疫情医疗信息管理...
该方法详细讲解了如何在SQL中实现K means
雖然SQLserver有rank() over,Oracle卻沒有,而且以此為基本方法可以變化為多個相關的SQL,比如 update 更新,order by 排序 等等
通过Mybatis拦截器自动定位慢SQL并记录日志
SQL Server群集实现方案 SQL Server群集实现方案
LINQ To SQL实现分页效果源码 VS2008 Frameworks3.5 LINQ To SQL 实现分页效果 数据库SQL 2005
查询SQL重复记录的几种方法总结,删除SQL重复记录查