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

来源:互联网 发布:紫微斗数软件 编辑:程序博客网 时间:2024/05/03 12:57
可能我说的交换排序还有点歧义。看下面的图片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 = @nowidWhere 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 = @nowidWhere 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

原创粉丝点击