可能我說的交換排序還有點歧義。看下面的圖片
就是要實現這樣的排序。
首先數據庫結構得具備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 調試