用SQLServer实现数据表中,将任意一条记录信息移动到该表中的任意位置

server|sqlserver|数据

-- 定位数据
-- 设计思路:
--   保存要被移动记录的原主键值和新主键值(如果有主键的话),然后比较两个主键值的大小(记录信息按升序排列),
--   如果原主键值大,表明该记录被移动到前面的新位置,可将原位置的记录信息保存下来,并将从新位置的记录信息到
--   原记录的前一条记录的信息顺次往下移动,把保存的原记录移动到新位置即可。
--   如果原主键值小,表明该记录被移动到后面的新位置,可将原位置的记录信息保存下来,并将从新位置的记录信息到
--   原记录的下一条记录的信息顺次往上移动,把保存的原记录移动到新位置即可。实际上就是记录块的移动.
--   但是,如果数据表中的数据非常庞大,该存储过程的执行效率将会下降.
 

Use zzydb

--创建举例表(学生信息表)
Create Table T_StudentsInfo
(i_id int identity(1,1), --系统自增流水号
 c_Stu_ID nvarchar(10), --学号
 c_ClassName nvarchar(50), --班级
 d_BirthDay datetime) --出生日期
go

--向举例表中插入4条学生信息,以验证下面的存储过程(sp_MyAdjustRecordOrder)
Insert into T_StudentsInfo values('001', '大二三班', '1978-01-25')
Insert into T_StudentsInfo values('002', '大一六班', '1979-02-05')
Insert into T_StudentsInfo values('003', '大四三班', '1981-07-15')
Insert into T_StudentsInfo values('004', '大三一班', '1976-01-05')

select * from T_StudentsInfo

if object_id('sp_MyAdjustRecordOrder') <> 0
 drop proc sp_MyAdjustRecordOrder
go

Create Proc sp_MyAdjustRecordOrder(@OldStuId nvarchar(10), @NewStuId nvarchar(10))
as
--@OldStuid 学生学号(用以表示被移动的记录),
--@NewStuid 学生学号(用以表示将被移动的记录插入的新位置)
begin
 declare @Old_i_id int, @New_i_id int
 declare @i_BlockCount int--即将被移动的记录块条数
 declare @i int--循环变量

 --获得id值
 Select @Old_i_id = (select I_id from T_StudentsInfo where c_Stu_ID = @OldStuId)
 Select @New_i_id = (select I_id from T_StudentsInfo where c_Stu_ID = @NewStuId)
 select @i_BlockCount = abs(@Old_i_id - @New_i_id)

 --保存被移动的学生信息
 Select c_Stu_ID, c_ClassName, d_BirthDay
  into New_StudentsInfo--临时创建的表,用完后删除
 from T_StudentsInfo
 where c_Stu_ID = @OldStuId
 
 
 if @New_i_id < @Old_i_id --将原记录信息移动到了前面
 begin
  select @i = 0
  while @i <= @i_BlockCount - 1
  begin
   update T_StudentsInfo
   set c_Stu_ID = T2.c_Stu_ID,
    c_ClassName = T2.c_ClassName,
    d_BirthDay = T2.d_BirthDay
   From T_StudentsInfo , T_StudentsInfo T2
   where   (T_StudentsInfo.i_id = @Old_i_id - @i) and
     (T2.i_id = @Old_i_id - @i - 1)
   
   select @i = @i + 1  
  end
 end

 if @New_i_id > @Old_i_id --将原记录信息移动到了后面
 begin
  select @i = 0
  while @i <= @i_BlockCount - 1
  begin
   update T_StudentsInfo
   set c_Stu_ID = T2.c_Stu_ID,
    c_ClassName = T2.c_ClassName,
    d_BirthDay = T2.d_BirthDay
   From T_StudentsInfo, T_StudentsInfo T2
   where   (T_StudentsInfo.i_id = @Old_i_id + @i) and
     (T2.i_id = @Old_i_id + @i + 1)
   
   select @i = @i + 1  
  end
 end

 update T_StudentsInfo
 set c_Stu_ID = T3.c_Stu_ID,
  c_ClassName = T3.c_ClassName,
  d_BirthDay = T3.d_BirthDay
 From T_StudentsInfo T1, New_StudentsInfo T3
 where   (T1.i_id = @New_i_id )

 Drop table New_StudentsInfo
 --if @New_i_id = @Old_i_id --位置未发生改变,不做任何处理
end
go

--使用举例
--要求:将c_Stu_Id为'004'的学生信息移动到c_Stu_Id为'002'的学生信息之前的位置.
--调用存储过程 sp_MyAdjustRecordOrder('004','002')即可.
--注意:这里的i_id必须是顺序的。

--备份表数据信息,以便于比较
select *
into StudentsInfoBackup
from T_StudentsInfo

--比较结果是否一致
select * from StudentsInfoBackup
select * from T_StudentsInfo

--移动数据记录信息,调用存储过程
exec sp_MyAdjustRecordOrder '003', '002'

--比较结果是否改动
select * from StudentsInfoBackup
select * from T_StudentsInfo

时间: 2024-11-02 02:44:59

用SQLServer实现数据表中,将任意一条记录信息移动到该表中的任意位置的相关文章

数据库表-Oracle的一张表最多可以放多少条记录

问题描述 Oracle的一张表最多可以放多少条记录 Oracle的一张表最多可以放多少条记录?一张表的记录多到多少的时候要分表?另外如果用jpa自动生成主键会不会出现主键值达到jpa所设计的最大值的情况 解决方案 放个几千万条应该没问题,在你还没有用到那么大的时候,你就会想要分表分库了. 解决方案二: 没人知道?哪位给指点一下

C#中从sqlserver数据库中随机提取一条记录并显示在不同的文本框中

问题描述 C#中从sqlserver数据库中随机提取一条记录并显示在不同的文本框中如图 解决方案 解决方案二:SQL:selecttop1姓名,学号,班级from表orderbynewid()C#对应上就好了.

java-新手求助:sql语句,从多个表中取出最新时间的记录,组成一个新表

问题描述 新手求助:sql语句,从多个表中取出最新时间的记录,组成一个新表 解决方案 mysql的实现: insert into zongbiao(id, name ,vd,co2,wendu,time) select t1.id,t1.name,t1.vd,t2.co2,t2.wendu,t2.time from biao1 t1 join biao2 t2 on(t1.id=t2.id) order by t2.time desc limit 1; 解决方案二: 1.mysql和oracle

SQL Server某一数据表最多能存储多少条记录呢?

问题描述 SQL Server某一数据表最多能存储多少条记录呢? 解决方案 没有上限的,这是联机帮助上的原话: 每个表的行数: 受可用存储资源限制 这个可用资源受下面几个因素的影响: 1.你的磁盘剩余空间 2.你的数据文件所在的磁盘分区格式,FAT16只支持最大2G的数据文件,FAT32只支持最大4G的数据文件 3.你的SQL版本,如果你是用msde,则单个数据文件最大仅支持2G,其他版本的数据库最大支持32TB 4.你的表所在文件组的文件数解决方案二:只要机器够好,应该没有最大值,只是性能问题

如何将datagrid控件中更改的多条记录数据一次更新到数据源中?

问题描述 如何将datagrid控件中更改的多条记录数据一次更新到数据源中?

select-SQLServer中如何判断一条记录不能存在并使用其他值代替?

问题描述 SQLServer中如何判断一条记录不能存在并使用其他值代替? 现有表tableA,tableB.tableA有一列为bid,是通过该列跟tableB中的一行记录关联 . 一个存储过程中的语句如下,作用是获取A表中的一些信息,并通过bid获取与其关联的 tableB中的某一行的信息.(另外,tableB中会有一个aid的列,通过该列和tableA中的一条记录对应,一条talbeA中的记录可以对应tableB中多条记录,以最后更新的那条tableB记录为绑定) select tableA

db2-DB2取100到200条记录无排序(取出数据库中固定的记录)

问题描述 DB2取100到200条记录无排序(取出数据库中固定的记录) 第一种:思路-->>现获取前100条然后查询结果集在这100条意外再取前100条记录. 代码:SELECT * FROM TABLE WHERE ID not in ( SELECT ID FROM TABLE FETCH FIRST 100 ROWS ONLY ) FETCH FIRST 100 ROWS ONLY . 第二种:思路-->>分页技术,给所有记录添加id,然后取101到200条记录. 代码:SE

代码-dreamweaver cs6 怎么在框架中显示数据库中的某一条记录?

问题描述 dreamweaver cs6 怎么在框架中显示数据库中的某一条记录? 我在制作网页的时候陷入了瓶颈,现在希望能在dreamweaver中实现这个功能:点开一个链接,直接显示出数据库中的某一条记录,并且在下面的"推荐项目"后随机显示出其他的条目. 如果要实现这个功能,代码应该怎么写 解决方案 通过javascript等来访问数据库,获取数据,然后再显示到html页面 http://www.jb51.net/article/42178.htm 解决方案二: Dreamweave

javaweb-探讨个问题:一对一双向关联的表,如何插入一条记录。

问题描述 探讨个问题:一对一双向关联的表,如何插入一条记录. 嗨,大家有空吗?探讨一个问题. 一对一双向关联,要插入一条记录. 举个简单例子.一个班级有一个班主任,一个老师只能任一个班级班主任.(一对一) Teacher表 Class表 id(自增) id(自增) name name classId teacherId 插入一条记录: 思路--> 第一步:先向Teacher插入一条记录.返回新插入的id值.(selectKey) 第二步:再向Class插入一条记录,teacherId=上一步返回