用SQL实现记录上下移动的思路

  在做管理系统时,不可避免会要求对记录进行上下移动.
  假如我们有一张表 t_test ,它的字段如下:  

None.gifCREATE TABLE [dbo].[t_test] (
None.gif    
[sysid] [bigint] NOT NULL ,
None.gif    
[cname] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
None.gif    
[position] [int] NULL 
None.gif)

  其中的position用来表示记录排列次序。

  首先,讨论一下移动一条记录的的SQL语句写法(为简化问题,只写了上移的语句):

None.gif--传入参数ID
None.gif
declare @id bigint
None.gif
set @id=5
None.gif
None.gif--
以下为实现代码
None.gif
declare @pre bigint,@p0 int
None.gif
//Step1:找到比它小的且最大的Position的那条记录
None.gif
select @pre=sysid,@p0=position from 
None.gif    (
select max(b.position) as m from t_test a,t_test b where a.sysid=@id and b.position<a.position) t,t_test c 
None.gif    
where c.position=t.m
None.gif--
Step2:更新前一条记录,让Position+1
None.gif
update t_test set position=position+1 where sysid=@pre
None.gif--
Step3:更新当前记录,让Position=前一条记录
None.gif
update t_test set position=case when @p0 is NULL then 0 else @p0 end where sysid=@id

  逻辑写在注释里了,应该不难看明白。也就是找到前一条记录,跟当前记录交换一下即可。

  然后,我们来看多条记录同时移动的方法,其实可以把上面的过程写进存储过程,然后在前台代码中用循环调用一下即可,如果我们要在SP中实现循环,也可以这样来做:

None.gif--传入参数,一个以‘,'分隔的字串
None.gif
declare @ids nvarchar(20)
None.gif
None.gif
set @ids='2,4'
None.gif
None.gif
--以下为实现代码
None.gif
declare @tmp nvarchar(128),@idx int,@start int,@num nvarchar(8)
None.gif
declare @id bigint,@pre bigint,@pold int
None.gif
None.gif
--Step1:找到第一个分隔符
None.gif
set @tmp = @ids
None.gif
set @idx = charindex(',',@tmp)
None.gif
None.gif
--Step2:循环每个切开的字串
None.gif
while @idx<>0
None.gif
begin
None.gif  
--Step2.1:切开一段
None.gif
  set @num = substring(@tmp,1,@idx-1)
None.gif  
set @tmp = substring(@tmp,@idx+1,len(@tmp)-@idx)
None.gif  
--print 'num='+@num
None.gif
  set @idx=charindex(',',@tmp)
None.gif
None.gif  
--按单条记录移动的方法处理(其实可以用调用另一个SP的方法实现)
None.gif
  set @id=convert(bigint,@num)
None.gif
None.gif  
select @pre=sysid,@pold=position from 
None.gif    (
select max(b.position) as m from t_test a,t_test b where a.sysid=@id and b.position<a.position) t,t_test c 
None.gif    
where c.position=t.m
None.gif
None.gif  
update t_test set position=position+1 where sysid=@pre
None.gif  
update t_test set position=case when @pold is NULL then 0 else @pold end where sysid=@id  
None.gif
None.gif
end
None.gif
None.gif  
--Step3:注意最后一段也要处理一下
None.gif
  --剩下的字串完整处理即可
None.gif
  set @num = substring(@tmp,1,len(@tmp))
None.gif  
--print 'num='+@num
None.gif

None.gif  
set @id=convert(bigint,@num)
None.gif
None.gif  
select @pre=sysid,@pold=position from 
None.gif    (
select max(b.position) as m from t_test a,t_test b where a.sysid=@id and b.position<a.position) t,t_test c 
None.gif    
where c.position=t.m
None.gif
None.gif  
update t_test set position=position+1 where sysid=@pre
None.gif  
update t_test set position=case when @pold is NULL then 0 else @pold end where sysid=@id  

   因为从页面上的checkbox传过来的参数,形式就是以逗号分隔的字串,所以如果直接再传给SP来处理,应该是比较方便的。

转载于:https://www.cnblogs.com/sharetop/archive/2005/12/29/307576.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

误删了计算机桌面回收站,我电脑回收站里的东西已经被删除几天了?怎么可以找回!谢谢...

可以通过数据恢复软件来进行恢复的操作&#xff0c;具体如下&#xff1a;步骤一&#xff1a;在常用的电脑浏览器上搜索【互盾数据恢复软件】&#xff0c;然后将安装包下载至电脑上&#xff0c;安装完成&#xff0c;下载和安装的路径都要避免回收站所在的分区&#xff0c;避免造…

代码整洁之道--思维导图

#思维导图源码 System.out.println("https://www.processon.com/view/60dede90e401fd7e342b3fc3?fromnew1");

[转]该学Java或.NET?

该学Java或.NET&#xff1f;自从.NET问世以来&#xff0c;程序员都很关心的一个问题是「该学Java或.NET」。我也在挣扎&#xff0c;该「该继续Java的研究&#xff0c;或者该开始准备培养.NET的知识」。 当然&#xff0c;最好是能两者兼顾&#xff0c;但是每个人的时间都很有限&…

人工智能、区块链、图灵测试....这29个大数据热词你知道几个?

来源&#xff1a;中国科协智能制造学会联合体2017年&#xff0c;大数据产业依旧保持高速增长态势&#xff0c;并从单一的技术概念逐渐转化为新要素、新战略、新思维。鉴别真假内行的时候来了&#xff0c;你真的明白这些科技热词的意思吗&#xff1f;以下为您挑选了29个和大数据…

计算机应用基础在线作业川大,川大《计算机应用基础》秋在线作业.doc

川大《计算机应用基础》秋在线作业奥鹏17春川大《计算机应用基础0006》16秋在线作业2一、单选题(共 50 道&#xff0c;共 100 分。)1. 以下格式中&#xff0c;属于音频文件格式的是____&#xff1a;A. MOVB. DATC. JPGD. WAV标准解&#xff1a;2. TCP/IP协议是Internet中计算机…

Replace Data Value with Object(以对象取代数据值)

有一个数据项&#xff0c;需要与其他数据和行为一起使用才有意义 将数据项变成对象。 动机 开发初期&#xff0c;你往往决定以简单的数据项表示简单的情况。但是&#xff0c;随着开发的进行&#xff0c;你可能会发现&#xff0c;这些简单数据项不再那么简单了。比如说&#xf…

实践单元测试(2) - 大话单元测试

...我知道这个项目bug很多&#xff0c;无法按时完成&#xff0c;即使老板把我炒了也是应该的。曾经有一个做单元测试的机会放在我面前&#xff0c;我没有珍惜&#xff0c;等到后来项目雪崩了才后悔。如果上天能再给我一次机会&#xff0c;我会对老板说&#xff1a;我要做单元测…

美研究揭示大脑如何学习语言

来源&#xff1a;中国科学报美国一项新研究表明&#xff0c;人类用于学习语言的大脑回路还能“兼职”其他用途&#xff0c;而非此前认为的是专门用于学习语言的模块。发表在最新一期美国《国家科学院学报》上的这项研究显示&#xff0c;儿童学习母语及成年人学习外语时使用的大…

计算机如何获取知识和技能 实现自我完善,在人工智能中有一个研究领域,主要研究计算机如何获取知识和技能,实现自我完善,这门分支学科叫做。...

摘要&#xff1a;协议在T中&#xff0c;人主要门主要标志地理是指。有域研究情绪调节词解法名释。究领计算机技能叫现场名词解释实验。...协议在T中&#xff0c;人主要门主要标志地理是指。工智个研霍桑在并证的存发现实验实了。有域研究情绪调节词解法名释。改善质的积累引起必…

Change Value to Reference(将值对象改为引用对象)

从一个类衍生出许多彼此相等的实例&#xff0c;希望将他们替换为同一个对象 将这个值对象变成引用对象。 动机 在许多系统中&#xff0c;你都可以为对象做一个有用的分类&#xff1a;引用对象和值对象。前者就像“客户”、“账户”这样的东西&#xff0c;每个对象都代表真实世…

电子音乐包括电声乐器和计算机音乐,浅谈电子音乐制作的发展方向

一、从“萌芽”到“成熟”阶段的回顾1.电子音乐制作的萌芽阶段回顾历史是为了更好的发展。电子音乐发展的最初阶段是从港台流入到大陆的录音机。把用简陋的录音机把音乐录制下来的这个时期称之为电子音乐的萌芽期。通过原始的录音制作&#xff0c;成为当时最为先进的电子音乐。…

人工智能创业指南:AI 产品未来的发展模式及策略

来源&#xff1a;36氪概要&#xff1a;未来&#xff0c;AI会成为一种基础服务&#xff0c;同时&#xff0c;这种服务会像电力一样通过网络进行传输。有观点认为&#xff0c;未来&#xff0c;AI会成为一种基础服务&#xff0c;同时&#xff0c;这种服务会像电力一样通过网络进行…

实现一个压缩Remoting传输数据的Sink:CompressionSink (转载)

在前两讲《初探.Net Remoting服务端 Loading Remtoing配置内容的过程 》《初探.Net Remoting客户端 Loading Remtoing配置内容的过程 》中,我已经分析了Remoting 的Sink机制&#xff0c;接下来&#xff0c;就提供一个具体的范例&#xff1a;CompressionSink&#xff08;原始Sou…

江西省2019计算机二级报名日期,2020年3月江西计算机等级报名时间、报名入口【2019年12月18日-27日】...

【导语】《2020年3月江西全国计算机等级考试工作通知》现已发布。2020年3月江西计算机等级报名时间&#xff1a;2019年12月18日-27日&#xff0c;考试时间&#xff1a;2020年3月28日-30日&#xff0c;小编现将报考信息发布如下&#xff1a;一、报名时间2020年3月江西计算机等级…

Replace Array with Object(以对象取代数组)

有一个数组&#xff0c;其中的元素各自代表不同的东西 String[] row new String[3]; row[0] "Liverpool"; row[1] "15"; 重构&#xff1a;以对象替换数组。对于数组中的每个元素&#xff0c;以一个字段来表示 Performance row new Performance(); r…

PNAS最新研究揭示大脑如何学习语言

来源&#xff1a;生物360概要&#xff1a;美国一项新研究表明&#xff0c;人类用于学习语言的大脑回路还能“兼职”其他用途&#xff0c;而非此前认为的是专门用于学习语言的模块。美国一项新研究表明&#xff0c;人类用于学习语言的大脑回路还能“兼职”其他用途&#xff0c;而…

ASP.NET2.0 ObjectDataSource的使用详解

介绍ObjectDataSource的使用&#xff0c;按照dudu的建议为了节省篇幅&#xff0c;做成连接&#xff0c;这里仅提供前三篇&#xff0c;后面还有几篇以后再补充吧ASP.NET2.0 ObjectDataSource的使用详解&#xff08;1&#xff09; ASP.NET2.0 ObjectDataSource的使用详解&#xf…

2018年12月计算机一级试题答案,2018年12月计算机一级MSOffice冲刺题及答案(7)

[1] 下列不是微机总线的是( )。[参考答案C][A] 数据总线[B] 地址总线[C] 信息总线[D] 控制总线[2] 下列各进制数中最大的数是( )。[参考答案D][A] 227O[B] 1FFH[C] 1010001B[D] 789D[3] ( )不是微型计算机必须的工作环境。 [参考答案A][A] 恒温[B] 良好的接地线路[C] 远离强磁场…

Duplicate Observed Data(复制“被监视数据”)

一些领域数据置身于GUI控件中&#xff0c;而领域函数需要访问这些数据 重构&#xff1a;将该数据复制到一个领域对象中。建立一个Observer 模式&#xff0c;可以同步领域对象和GUI 对象内的重复数据。 动机 一个分层良好的系统&#xff0c;应该将处理用户界面和处理业务逻辑的代…

Landing.AI创始人及CEO 吴恩达:人工智能与先进制造

来源&#xff1a;亿欧概要&#xff1a;工业互联网是工业革命和新一代科技革命的交汇&#xff0c;这个变革内涵非常广&#xff0c;包含很多新的业务模式、新的业态、新的产业机遇&#xff0c;同时也会带来很多新技术的创新。工业互联网是工业革命和新一代科技革命的交汇&#xf…