MS SqlServer 2000交换排序的一种方法

本文介绍了一种使用存储过程实现的交换排序方法,该方法适用于带有向上和向下箭头的排序界面,可在用户点击时调整数据库记录顺序。文章详细解释了.NET2.0环境下SQL Server 2000中如何通过存储过程进行排序交换,并提供了具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能我说的交换排序还有点歧义。看下面的图片 123123.jpg
就是要实现这样的排序。

首先数据库结构得具备3个字段
ID      ,    Name      ,      OrderNum

排序的规则为,首先按OrderNum倒序排列,然后如果OrderNum 相同则按ID的倒序排列。
Sql语句为
Select   *   From  Sorts  Order   By  OrderNum  Desc , ID     Desc


当点向上箭头的时候,表示要把当前的记录和上面的记录交换,实现排序。同样点向下箭头的时候也一样。


假设我们当需要把上图中ID为1的记录和ID为3的记录交换。假设是把1向上和3交换(点1的上箭头)。
如果,ID3的OrderNum 为2,ID1的OrderNum 为1,那么直接交换OrderNum 就可以。看来是如此,但是真的可以么?

假设数据如下:
ID            Name         OrderNum
4              ....               2
3               ....              2
6               ......            1
.........

上面的数据是可能的,假如把ID6的OrderNum 换成是2就跑第一个去了!

这里就不详细介绍各种可能了,我介绍下我采用的方法。
我使用存储过程来解决这个问题,需要传递的参数为:1、是up(上箭头)还是down(下箭头),2、选择记录的id,3、选择记录的order。

 <a href="?order=up&id=<%# Eval("ID") %>&type=<%# Eval("OrderNum ") %>">↑</a>
|
<a href="?order=down&id=<%# Eval("ID") %>&type=<%# Eval("OrderNum ") %>">↓</a>

存储过程为
CREATE   PROCEDURE  NewsSortOrder  @order   char ( 20 ), @id   int , @type   int   AS
declare   @nowid   int      -- 搜索上一条或下一条的ID
if   @order   =  "up"     -- 上升
begin
    
set   @nowid   =  ( select   Top   1  ID From  Sorts  Where  OrderNum >=   @type   And  ID <> @id   Order   By  OrderNum ASC  )
    
if   isnumeric ( @nowid =   1      -- 假如为数字的话
     begin
        
if  ( Select OrderNum  From  Sorts  Where  ID  =   @nowid =   @type          -- 假如两记录type相同的情况
         begin
            
Update  Sorts  Set  OrderNum =  OrderNum +   1   Where  ID  =   @id   Or  OrderNum >   @type      -- 该记录type+1并且他的上面的记录除了上一条type全部加一
         end
        
else
        
begin       -- 开始调换
             Update  Sorts  Set  OrderNum =  ( Select  OrderNum   From  Sorts  Where  ID  =   @nowid Where  ID  =   @id
            
Update  Sorts  Set  OrderNum   =   @type   Where  ID  =   @nowid
        
end
     
end
end
if   @order   =  "down"     -- 下降
begin
    
set   @nowid   =  ( select   Top   1  ID  From  Sorts  Where  OrderNum   <=   @type   And  ID  <> @id   Order   By  OrderNum   Desc )
    
if   isnumeric ( @nowid =   1      -- 如果为数字
     begin
        
if  ( Select  OrderNum   From  Sorts  Where  ID  =   @nowid =   @type          -- 假设两记录type相同
         begin
            
Update  Sorts  Set  OrderNum   =  OrderNum   -   1   Where  ID  =   @id   Or  OrderNum   <   @type      -- 该记录type-1并且他的下面的记录除了下一条type全部减一
         end
        
else
        
begin      -- 开始调换
             Update  Sorts  Set  OrderNum   =  ( Select  OrderNum   From  Sorts  Where  ID  =   @nowid Where  ID  =   @id
            
Update  Sorts  Set  OrderNum   =   @type   Where  ID  =   @nowid
        
end
     
end
end
GO
以上是.Net2.0 + SqlServer 2000 调试

http://birdshover.cnblogs.com

 

http://www.cnblogs.com/birdshover/archive/2006/08/11/473847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值