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


    可能我说的交换排序还有点歧义。看下面的图片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
  • 相关阅读:
    Ubuntu 12.04 git server
    Moonlight不再继续?!
    Orchard 视频资料
    一恍惚八月最后一天了
    Box2D lua binding and Usage
    50岁还在编程,也可以是一种成功
    DAC 4.2 发布
    再次祝贺OpenStack私有云搭建成功
    vue项目快速搭建
    pdf.js使用详解
  • 原文地址:https://www.cnblogs.com/birdshover/p/473847.html
Copyright © 2020-2023  润新知