MS SqlServer 2000交换排序的一种方法
可能我说的交换排序还有点歧义。看下面的图片
就是要实现这样的排序。
首先数据库结构得具备3个字段
ID , Name , OrderNum
排序的规则为,首先按OrderNum倒序排列,然后如果OrderNum 相同则按ID的倒序排列。
Sql语句为
当点向上箭头的时候,表示要把当前的记录和上面的记录交换,实现排序。同样点向下箭头的时候也一样。
假设我们当需要把上图中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>
存储过程为
http://birdshover.cnblogs.com
就是要实现这样的排序。
首先数据库结构得具备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 调试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
http://birdshover.cnblogs.com