上移 下移的存储过程
http://topic.csdn.net/t/20051210/13/4450662.html
此存储过程改写测试可以正常使用,排序的字段要先排好序号,填写数据的时候,查询最大的序号再加1
然后使用该存储过程即可
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE  [dbo].[tp_MoveOrder]
 (
  @ID int,
  @Direction int  --   @Direction   :   move   up   :   -1   ,   move   down   :   1   
 ) 
AS 
 declare @TempID int
 declare @OrderNo int
 declare @MaxOrderNo int
 
 declare @OrderNo_1 int
 declare @OrderNo_2 int
 
 declare @TempID_1 int
 declare @TempID_2 int
 
 begin
    set NOCOUNT ON
     begin
      select @OrderNo=OrderNum,@TempID=ID from Ks_ScoreField where ID=@ID
      select @MaxOrderNo=max(OrderNum) from Ks_ScoreField
      set @OrderNo_1 =@OrderNo
      set @OrderNo_2=@OrderNo+@Direction
       if(@MaxOrderNo=1)
           return 0 --只有一条记录则返回
       -------------------------------------------------------
       if((@OrderNo=1)AND (@Direction=-1)) --设置move   up   orderno  
     begin
      set @OrderNo_1=1;
      set @OrderNo_2=@MaxOrderNo
     end
   --------------------------------------------------------   
     if((@OrderNo=@MaxOrderNo)AND (@Direction=1))--设置move   down   orderno  
      begin
       set @OrderNo_1=1
       set @OrderNo_2=@MaxOrderNo
      end
      ----------------------------------------------------------
       --根据orderno取得不同的move资料   
       select @TempID_1=ID from Ks_ScoreField where OrderNum=@OrderNo_2
       select @TempID_2=ID from Ks_ScoreField where OrderNum=@OrderNo_1
              ---------------------------------------------------------
              --update   orderno   
              update Ks_ScoreField set OrderNum=@OrderNo_1 where ID=@TempID_1
              if @@ERROR <>0
                 RETURN 1
                 --update   orderno   
               ---------------------------------------------
               UPDate Ks_ScoreField set ordernum=@OrderNo_2 where ID=@TempID_2
               if @@ERROR <>0
               RETURN 1
     end
     RETURN 0
 end
 
==========================================
create   proc   p_move   
  @OrderNum   int, --要处理的序号 就是排序的字段
  @direction   char(1)='下' --移动方向,'上'表示上移,'下'表示下移   
  as   
  declare   @nid   int   
  select   @nid=case   when   @direction='上'   then   min(OrderNum)   else   max(OrderNum)   end   
  from   Ks_ScoreField   
    
  --如果不可移动,则退出   
  if   @OrderNum=@nid   return   
    
  --取得移动后的新   SortId   值   
  set   @nid=@OrderNum+case   when   @direction='上'   then   -1   else   @OrderNum   end   
    
  --更新   SortId   
  update   Ks_ScoreField  set   OrderNum=case   when   OrderNum=@OrderNum   then   @nid   else   @OrderNum   end   
  where   OrderNum   in(@OrderNum,@nid) 
======================================
要原理就是抓取当前记录的orderno,然后上移-1,下移+1,这样在数据库中已经把orderno字段给更新了,然后又是重新绑定,重新绑定的时候是按orderno来排序的,自然分页的顺序也就跟着变了,cs代码其实很简单就是单纯调用存储过程,所有逻辑已经在存储过程中处理过了。但是一定要记得在绑定的sql语句要有orderno的排序   
    
  --测试表   
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[Job_Person]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)   
  drop   table   [dbo].[Job_Person]   
  GO   
    
  CREATE   TABLE   [dbo].[Job_Person]   (   
  [Job_PersonID]   [int]   NOT   NULL   ,   
  [PersonID]   [int]   NOT   NULL   ,   
  [OrderNo]   [int]   NULL   ,   
  [CreateOn]   [datetime]   NULL   ,   
  [CreateByID]   [int]   NULL   ,   
  [ModifyOn]   [datetime]   NULL   ,   
  [ModifyByID]   [int]   NULL     
  )   ON   [PRIMARY]   
  GO   
    
  --测试存储过程   
  CREATE   PROCEDURE   tp_MoveOrder_Entity_Job   
  (   
                    @Job_EntityID int,--表主键id   
    @Direction           INT, --   @Direction   :   move   up   :   -1   ,   move   down   :   1   
    @UserID   int --修改人id   
  )       
  AS   
  declare   @EntityID                   int   
  declare   @OrderNo     INT   
  declare   @MaxOrderNo   Int   
    
  declare   @OrderNo_1   int   
  declare   @OrderNo_2   int   
    
  declare   @Job_EntityID_1   int   
  declare   @Job_EntityID_2   int   
    
  BEGIN   
    
  SET   NOCOUNT   ON   
    
  BEGIN     
        
              Select   @OrderNo   =   OrderNo,   @EntityID   =   PersonID   From   Job_Person   
                                  Where   Job_PersonID   =   @Job_EntityID   
    
                select   @MaxOrderNo   =   max(OrderNo)   From   Job_Person   
                                  WHERE     PersonID   =   @EntityID   
    
                          SET   @OrderNo_1   =   @OrderNo   
                          SET   @OrderNo_2   =   @OrderNo   +   @Direction                                             
    
                  if   (@MaxOrderNo   =   1   )   
                                  return   0         --只有一条记录则返回                           
    
                  if   ((@OrderNo     =   1   )   AND   (@Direction   =   -1))--设置move   up   orderno   
                  BEGIN   
                                    
                          SET   @OrderNo_1   =   1   
                          SET   @OrderNo_2   =   @MaxOrderNo               
                  END   
    
                  if   ((@OrderNo     =   @MaxOrderNo   )   AND   (@Direction   =   1))--设置move   down   orderno   
                  BEGIN   
                                    
                          SET   @OrderNo_1   =   1   
                          SET   @OrderNo_2   =   @MaxOrderNo               
                  END   
    
                  --根据orderno取得不同的move资料   
                  select   @Job_EntityID_1=   Job_PersonID   from   Job_Person   
                  where   PersonID   =   @EntityID       and   OrderNo   =   @OrderNo_2   
                    
                  select   @Job_EntityID_2=   Job_PersonID   from   Job_Person   
                  where   PersonID   =   @EntityID   and   OrderNo   =   @OrderNo_1     
  --update   orderno   
          update   Job_Person   
  set   orderno   =   @OrderNo_1,   
  ModifyOn   =   getdate(),   
  ModifyByID   =   @UserID   
  where   Job_PersonID   =   @Job_EntityID_1   
    IF   @@ERROR   <>   0   
          RETURN   1   
  --update   orderno   
            update   Job_Person   
  set   orderno   =   @OrderNo_2,   
  ModifyOn   =   getdate(),   
  ModifyByID   =   @UserID   
  where   Job_PersonID   =   @Job_EntityID_2   
    IF   @@ERROR   <>   0   
          RETURN   1                     
  END               
    
  RETURN   0   
    
  END   
  GO   
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号