比如一个表table
id name
1 小明
2 小张
3 小王
4 啊毛
5 小苏在后台我有个上移的按扭
当我选定啊毛他就上移一个
id name
1 小明
2 小张
4 啊毛
3 小王
5 小苏
下移按钮也同样选定下移一个这个sql能实现吗?如何实现~谢谢大家了
id name
1 小明
2 小张
3 小王
4 啊毛
5 小苏在后台我有个上移的按扭
当我选定啊毛他就上移一个
id name
1 小明
2 小张
4 啊毛
3 小王
5 小苏
下移按钮也同样选定下移一个这个sql能实现吗?如何实现~谢谢大家了
--> 生成测试数据: [T]
IF OBJECT_ID('[T]') IS NOT NULL DROP TABLE [T]
CREATE TABLE [T] (id INT,name VARCHAR(4))
INSERT INTO [T]
SELECT '1','小明' UNION ALL
SELECT '2','小张' UNION ALL
SELECT '3','小王' UNION ALL
SELECT '4','啊毛' UNION ALL
SELECT '5','小苏'--SQL查询如下:GO
CREATE PROC p
@opeartor bit=1, --1下移,0上移
@id int
AS
DECLARE @nid int;
IF @opeartor=1
SET @nid=(SELECT MIN(id) FROM T WHERE id>@id);
ELSE
SET @nid=(SELECT MAX(id) FROM T WHERE id<@id);
UPDATE a
SET name=b.name
FROM T AS a
JOIN T AS b
ON a.id BETWEEN CASE WHEN @opeartor=1
THEN @id
ELSE @nid
END
AND CASE WHEN @opeartor=1
THEN @nid
ELSE @id
END
AND b.id BETWEEN CASE WHEN @opeartor=0
THEN @nid
ELSE @id
END
AND CASE WHEN @opeartor=0
THEN @id
ELSE @nid
END
AND a.id=CASE WHEN b.id=@id THEN @nid ELSE @id END
GOexec p 0,4SELECT * FROM T
GO
DROP PROC p
DROP TABLE T/*
id name
----------- ----
1 小明
2 小张
3 啊毛
4 小王
5 小苏(5 行受影响)
*/
set QUOTED_IDENTIFIER ON
gocreate PROCEDURE [dbo].[Proc_Common_UpDown]
@Sign int = 0, -- 0: 上移 1:下移
@TableName nvarchar(50), -- 表名
@ItemName nvarchar(50), -- 主键字段名
@ItemID int, -- 主键ID
@SortName nvarchar(50), -- 排序ID
@TypeName nvarchar(50)='', -- 分类字段名
@TypeValue nvarchar(50)= '' -- 分类值
AS
BEGIN
SET NOCOUNT ON
DECLARE @SQL nvarchar(4000),
@ThisSort int, -- 当前ID
@PREVID int, -- 前一个ID
@NextID int, -- 后一个ID
@Count int
--临时索引表--
IF(OBJECT_ID('temp..#Tab') IS NOT NULL) DROP TABLE #Tab
CREATE TABLE #Tab (ItemID int,Sort int)
SET @SQL = 'INSERT INTO #Tab (ItemID,Sort) SELECT '+@ItemName+','+@SortName+' FROM '+@TableName
PRINT @SQL
IF (@TypeName<>'' AND @TypeValue<>'') SET @SQL = @SQL+' WHERE '+@TypeName+'='+@TypeValue
SET @SQL = @SQL+' ORDER BY '+@SortName+' ASC '
PRINT @SQL
EXEC(@SQL)
SET @SQL = ''
SELECT @Count = COUNT(*) FROM #Tab
SELECT @ThisSort = Sort FROM #Tab WHERE ItemID = @ItemID
IF(@ThisSort>1) SELECT @PREVID = ItemID FROM #Tab WHERE Sort=(@ThisSort-1)
IF(@ThisSort<@Count) SELECT @NextID = ItemID FROM #Tab WHERE Sort=(@ThisSort+1)
IF(@Sign=0)
BEGIN
IF(@ThisSort>1)
BEGIN
SET @SQL = 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),(@ThisSort-1))+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),@ThisSort)+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@PREVID)
END
END
ELSE
BEGIN
IF(@ThisSort<@Count)
BEGIN
SET @SQL = 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),(@ThisSort+1))+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),@ThisSort)+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@NextID)
END
END
EXEC(@SQL)
END
--EXEC Proc_Common_UpDown 0,'t_EventParameter','id',33,'order_index','EventType','1011'
出自
http://hi.baidu.com/gguozhenqian/blog/item/66e85750863c8e3443a75b66.html