可能我说的交换排序还有点歧义。看下面的图片
就是要实现这样的排序。
首先数据库结构得具备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
就是要实现这样的排序。
首先数据库结构得具备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
http://birdshover.cnblogs.com
http://www.cnblogs.com/birdshover/archive/2006/08/11/473847.html
本文介绍了一种使用存储过程实现的交换排序方法,该方法适用于带有向上和向下箭头的排序界面,可在用户点击时调整数据库记录顺序。文章详细解释了.NET2.0环境下SQL Server 2000中如何通过存储过程进行排序交换,并提供了具体实现代码。
16

被折叠的 条评论
为什么被折叠?



