比如一个表table
id    name
1     小明
2     小张
3     小王
4     啊毛
5     小苏在后台我有个上移的按扭
当我选定啊毛他就上移一个
id    name
1     小明
2     小张
4     啊毛
3     小王
5     小苏
下移按钮也同样选定下移一个这个sql能实现吗?如何实现~谢谢大家了

解决方案 »

  1.   

    --> liangCK小梁 于2008-10-13
    --> 生成测试数据: [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 行受影响)
    */
      

  2.   

    通用的排序的上移下移功能set ANSI_NULLS ON
    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