一个根据SortOrder控制排序的存储过程

表结构如:
TacticIDuniqueidentifier
ParentTacticIDuniqueidentifier
EnterpriseUIDuniqueidentifier
Namenvarchar(256)
SortOrderint

其中有父子关系和以SortOrder进行排序,以下的存储过程用于控制同级下的排序更新。

None.gif CREATE   PROCEDURE  dbo.emb_Performance_Tactic_UpdateSortOrder
None.gif(
None.gif    
@TacticID   uniqueidentifier ,
None.gif    
@MoveUp   bit
None.gif)
None.gif
AS  
None.gif SET   Transaction   Isolation   Level   Read   UNCOMMITTED   -- 设置事务
None.gif BEGIN
None.gif    
SET  NOCOUNT  ON
None.gif    
-- 定义变量
None.gif
     DECLARE   @currentSortValue   int                  -- 当前SortOrder值
None.gif
     DECLARE   @replaceSortValue   int                  -- 要替换的SortOrder值
None.gif
     DECLARE   @replaceTacticID   uniqueidentifier      -- 要替换的TacticID值
None.gif
     DECLARE   @ParentTacticID       uniqueidentifier      -- 当前父TacticID值
None.gif

None.gif    
-- 获取当前的SortOrder值
None.gif
     SELECT   @currentSortValue   =  SortOrder,  @ParentTacticID   =  ParentTacticID  FROM  EMB_Performance_Tactic  WHERE  TacticID  =   @TacticID  
None.gif    
None.gif    
-- 上移还是下移
None.gif
     IF  ( @MoveUp   =   1 )
None.gif        
BEGIN
None.gif        
-- 上移操作
None.gif
             -- 获取要替换的SortOrder
None.gif
             SELECT   @replaceSortValue   =   COALESCE (t.SortOrder,  - 1 ),  @replaceTacticID   =   COALESCE (t.TacticID,  ' {00000000-0000-0000-0000-000000000000} ' )
None.gif                
FROM  EMB_Performance_Tactic t
None.gif                    
inner   join  (
None.gif                        
select   top   1   *  
None.gif                        
from  EMB_Performance_Tactic 
None.gif                        
WHERE  ParentTacticID  =   @ParentTacticID   and  SortOrder  <   @currentSortValue   order   by  SortOrder  DESC
None.gif                    ) 
as  pf  on  
None.gif                        pf.TacticID 
=  t.TacticID
None.gif
None.gif            
if @replaceSortValue   !=   - 1  )
None.gif            
begin     
None.gif                
UPDATE  EMB_Performance_Tactic  SET  SortOrder  =   @currentSortValue   WHERE  TacticID  =   @replaceTacticID   -- 更新要替换项的SortOrder为当前值
None.gif
                 UPDATE  EMB_Performance_Tactic  SET  SortOrder  =   @replaceSortValue   WHERE  TacticID  =   @TacticID   -- 更新当前项的SortOrder为要替换项的SortOrder值
None.gif
             END  
None.gif        
END
None.gif    
ELSE
None.gif        
BEGIN
None.gif        
-- 下移操作
None.gif
             SELECT   @replaceSortValue   =   COALESCE (t.SortOrder,  - 1 ),  @replaceTacticID   =   COALESCE (t.TacticID,  ' 00000000-0000-0000-0000-000000000000 ' )
None.gif                
FROM  EMB_Performance_Tactic t
None.gif                    
inner   join  (
None.gif                        
select   top   1   *  
None.gif                        
FROM  EMB_Performance_Tactic 
None.gif                        
WHERE  ParentTacticID  =   @ParentTacticID   and  SortOrder  >   @currentSortValue   order   by  SortOrder  ASC                 
None.gif                    ) 
as  pf  on  
None.gif                        pf.TacticID 
=  t.TacticID
None.gif
None.gif
None.gif            
if @replaceSortValue   !=   - 1  )
None.gif            
BEGIN         
None.gif                
UPDATE  EMB_Performance_Tactic  SET  SortOrder  =   @currentSortValue   WHERE  TacticID  =   @replaceTacticID
None.gif                
UPDATE  EMB_Performance_Tactic  SET  SortOrder  =   @replaceSortValue   WHERE  TacticID  =   @TacticID
None.gif            
END
None.gif        
END
None.gif    
None.gif
END
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*  COALESCE用法。
InBlock.gif1、返回多个表达式中非空值的数据,如果所有表达式均为Null,则返回Null
InBlock.gif2、多表达式必须是相同类型,或者可以隐性转换为相同类型。
ExpandedBlockEnd.gif
*/

None.gif
GO
None.gif

http://www.ruiya.com


附加另一个例子:
1.数据表设计如下:
None.gif SET  ANSI_NULLS  ON
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  ON
None.gif
GO
None.gif
CREATE   TABLE   [ dbo ] . [ RedirectService_Category ] (
None.gif    
[ CategoryID ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL ,
None.gif    
[ ParentID ]   [ int ]   NOT   NULL ,
None.gif    
[ Name ]   [ nvarchar ] ( 256 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL ,
None.gif    
[ Description ]   [ nvarchar ] ( 2000 ) COLLATE Chinese_PRC_CI_AS  NULL ,
None.gif    
[ IsEnabled ]   [ bit ]   NOT   NULL   CONSTRAINT   [ DF_RedirectService_Category_IsEnabled ]    DEFAULT  (( 1 )),
None.gif    
[ SortOrder ]   [ int ]   NOT   NULL   CONSTRAINT   [ DF_RedirectService_Category_SortOrder ]    DEFAULT  (( 1 )),
None.gif    
[ CreateDate ]   [ datetime ]   NOT   NULL   CONSTRAINT   [ DF_RedirectService_Category_CreateDate ]    DEFAULT  ( getdate ()),
None.gif    
[ LastUpdatedDate ]   [ datetime ]   NOT   NULL   CONSTRAINT   [ DF_RedirectService_Category_LastUpdatedDate ]    DEFAULT  ( getdate ()),
None.gif 
CONSTRAINT   [ PK_RedirectService_Category ]   PRIMARY   KEY   CLUSTERED  
None.gif(
None.gif    
[ CategoryID ]   ASC
None.gif)
WITH  (PAD_INDEX   =   OFF , IGNORE_DUP_KEY  =   OFF ON   [ PRIMARY ]
None.gif
ON   [ PRIMARY ]
None.gif

2.存储过程:
None.gif SET  ANSI_NULLS  ON
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  ON
None.gif
GO
None.gif
--  =============================================
None.gif--
 Author:        RedirectService_Category_UpdateSortOrder
None.gif--
 Create date: 2006-01-06
None.gif--
 Description:    更新分类的排序ID
None.gif--
 =============================================
None.gif
CREATE   PROCEDURE   [ dbo ] . [ RedirectService_Category_UpdateSortOrder ]
None.gif(
None.gif    
@CategoryID   int ,     -- 对其操作的分类ID
None.gif
     @MoveUp   bit              -- 是否向上移动
None.gif
)
None.gif
AS
None.gif
BEGIN
None.gif    SET Transaction   Isolation   Level   Read   UNCOMMITTED  --设置事务
None.gif      BEGIN     
None.gif    
SET  NOCOUNT  ON ;
None.gif
None.gif    
-- 定义变量
None.gif
     DECLARE   @CurrentSortOrder   int          -- 当前SortOrder值
None.gif
     DECLARE   @ParentID   int                  -- 当前父分类ID
None.gif
     DECLARE   @ReplaceSortOrder   int          -- 要替换的SortOrder值
None.gif
     DECLARE   @ReplaceCategoryID   int          -- 要替换的CategoryID
None.gif

None.gif    
-- 为变量赋值
None.gif
     SELECT   @CurrentSortOrder   =   [ SortOrder ] @ParentID   =   [ ParentID ]
None.gif        
FROM   [ RedirectService_Category ]   WHERE   [ CategoryID ]   =   @CategoryID
None.gif
None.gif    
-- 上移还是下移
None.gif
     IF  ( @MoveUp   =   1 )
None.gif    
BEGIN
None.gif        
-- 上移操作
None.gif
         -- 获取要替换的SortOrder和要替换的分类ID '<' 'DESC'
None.gif
         SELECT   @ReplaceSortOrder   =   COALESCE (c. [ SortOrder ] - 1 ),
None.gif                
@ReplaceCategoryID   =   COALESCE (c. [ CategoryID ] - 1 )
None.gif            
FROM   [ RedirectService_Category ]  c  INNER   JOIN  (
None.gif                
SELECT   TOP   1   *   FROM   [ RedirectService_Category ]  
None.gif                    
WHERE   [ ParentID ]   =   @ParentID   AND   [ SortOrder ]   <   @CurrentSortOrder
None.gif                    
ORDER   BY   [ SortOrder ]   DESC
None.gif            ) 
AS  pc  ON  pc. [ CategoryID ]   =  c. [ CategoryID ]
None.gif        
None.gif        
-- 替换操作
None.gif
         IF ( @ReplaceSortOrder   !=   - 1   AND   @ReplaceCategoryID   !=   - 1 )
None.gif        
BEGIN
None.gif            
-- 更新要替换项的SortOrder为当前值
None.gif
             UPDATE   [ RedirectService_Category ]   SET   [ SortOrder ]   =   @CurrentSortOrder  
None.gif                
WHERE   [ CategoryID ]   =   @ReplaceCategoryID
None.gif            
-- 更新当前项的SortOrder为要替换项的SortOrder值
None.gif
             UPDATE   [ RedirectService_Category ]   SET   [ SortOrder ]   =   @ReplaceSortOrder  
None.gif                
WHERE   [ CategoryID ]   =   @CategoryID
None.gif        
END
None.gif    
END
None.gif    
ELSE
None.gif    
BEGIN
None.gif        
-- 下移操作
None.gif
         -- 获取要替换的SortOrder和要替换的分类ID    '>' 'ASC'
None.gif
         SELECT   @ReplaceSortOrder   =   COALESCE (c. [ SortOrder ] - 1 ),
None.gif                
@ReplaceCategoryID   =   COALESCE (c. [ CategoryID ] - 1 )
None.gif            
FROM   [ RedirectService_Category ]  c  INNER   JOIN  (
None.gif                
SELECT   TOP   1   *   FROM   [ RedirectService_Category ]  
None.gif                    
WHERE   [ ParentID ]   =   @ParentID   AND   [ SortOrder ]   >   @CurrentSortOrder
None.gif                    
ORDER   BY   [ SortOrder ]   ASC
None.gif            ) 
AS  pc  ON  pc. [ CategoryID ]   =  c. [ CategoryID ]
None.gif
None.gif        
-- 替换操作
None.gif
         IF ( @ReplaceSortOrder   !=   - 1   AND   @ReplaceCategoryID   !=   - 1 )
None.gif        
BEGIN
None.gif            
-- 更新要替换项的SortOrder为当前值
None.gif
             UPDATE   [ RedirectService_Category ]   SET   [ SortOrder ]   =   @CurrentSortOrder  
None.gif                
WHERE   [ CategoryID ]   =   @ReplaceCategoryID
None.gif            
-- 更新当前项的SortOrder为要替换项的SortOrder值
None.gif
             UPDATE   [ RedirectService_Category ]   SET   [ SortOrder ]   =   @ReplaceSortOrder  
None.gif                
WHERE   [ CategoryID ]   =   @CategoryID
None.gif        
END
None.gif    
END
None.gif
None.gif    
END
None.gif
END
None.gif
None.gif

2007-05-16 附加另处一个例子

None.gif USE   [ PermissionService ]
None.gif
GO
ExpandedBlockStart.gifContractedBlock.gif
/**/ /****** 对象:  Table [dbo].[ps_Targets]    脚本日期: 05/16/2007 14:04:44 ******/
None.gif
SET  ANSI_NULLS  ON
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  ON
None.gif
GO
None.gif
CREATE   TABLE   [ dbo ] . [ ps_Targets ] (
None.gif    
[ ApplicationId ]   [ uniqueidentifier ]   NOT   NULL ,
None.gif    
[ TargetId ]   [ uniqueidentifier ]   NOT   NULL   CONSTRAINT   [ DF_ps_Targets_TargetId ]    DEFAULT  ( newid ()),
None.gif    
[ ParentId ]   [ uniqueidentifier ]   NOT   NULL ,
None.gif    
[ Name ]   [ nvarchar ] ( 256 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL ,
None.gif    
[ Url ]   [ nvarchar ] ( 500 ) COLLATE Chinese_PRC_CI_AS  NULL ,
None.gif    
[ Description ]   [ nvarchar ] ( 2000 ) COLLATE Chinese_PRC_CI_AS  NULL ,
None.gif    
[ SortOrder ]   [ int ]   NOT   NULL ,
None.gif    
[ CreateDate ]   [ datetime ]   NOT   NULL   CONSTRAINT   [ DF_Targets_CreateDate ]    DEFAULT  ( getdate ()),
None.gif    
[ LastUpdatedDate ]   [ datetime ]   NOT   NULL   CONSTRAINT   [ DF_Targets_LastUpdatedDate ]    DEFAULT  ( getdate ()),
None.gif 
CONSTRAINT   [ PK_ps_Targets ]   PRIMARY   KEY   NONCLUSTERED  
None.gif(
None.gif    
[ TargetId ]   ASC
None.gif)
WITH  (IGNORE_DUP_KEY  =   OFF ON   [ PRIMARY ]
None.gif
ON   [ PRIMARY ]
None.gif

None.gif USE   [ PermissionService ]
None.gif
GO
ExpandedBlockStart.gifContractedBlock.gif
/**/ /****** 对象:  StoredProcedure [dbo].[ps_Targets_UpdateSortOrder]    脚本日期: 05/16/2007 14:05:37 ******/
None.gif
SET  ANSI_NULLS  ON
None.gif
GO
None.gif
SET  QUOTED_IDENTIFIER  ON
None.gif
GO
None.gif
None.gif
--  =============================================
None.gif--
 Author:        BillChen
None.gif--
 Create date: 2007-05-15
None.gif--
 Description:    ps_Targets_UpdateSortOrder
None.gif--
 =============================================
None.gif
CREATE   PROCEDURE   [ dbo ] . [ ps_Targets_UpdateSortOrder ]
None.gif(
None.gif    
@TargetId   uniqueidentifier ,     -- 对其操作的目标Id
None.gif
     @MoveUp   bit                      -- 是否向上移动
None.gif
)
None.gif
AS
None.gif
SET   Transaction   Isolation   Level   Read   UNCOMMITTED   -- 设置事务
None.gif
BEGIN
None.gif    
SET  NOCOUNT  ON ;
None.gif
None.gif    
-- 定义变量
None.gif
     DECLARE   @CurrentSortOrder   int                  -- 当前SortOrder值
None.gif
     DECLARE   @ParentId   uniqueidentifier              -- 当前父分类ID
None.gif
     DECLARE   @ReplaceSortOrder   int                  -- 要替换的SortOrder值
None.gif
     DECLARE   @ReplaceTargetId   uniqueidentifier      -- 要替换的TargetId
None.gif
     DECLARE   @ApplicationId      uniqueidentifier      -- 当前节点所属的ApplicationId
None.gif
    
None.gif    
-- 为变量赋值
None.gif
     SELECT   @CurrentSortOrder   =   [ SortOrder ] @ParentId   =   [ ParentId ] @ApplicationId   =   [ ApplicationId ]  
None.gif        
FROM   [ ps_Targets ]   WHERE   [ TargetId ]   =   @TargetId
None.gif
None.gif    
-- 上移还是下移
None.gif
     IF  ( @MoveUp   =   1 )
None.gif    
BEGIN
None.gif        
-- 上移操作
None.gif
         -- 获取要替换的SortOrder和要替换的TargetId '<' 'DESC'
None.gif
         SELECT   @ReplaceSortOrder   =   COALESCE (t. [ SortOrder ] - 1 ),
None.gif            
@ReplaceTargetId   =   COALESCE (t. [ TargetId ] ' 00000000-0000-0000-0000-000000000000 ' )
None.gif            
FROM   [ ps_Targets ]  t  INNER   JOIN  (
None.gif                
SELECT   TOP   1   *   FROM   [ ps_Targets ]  
None.gif                    
WHERE   [ ApplicationId ]   =   @ApplicationId   AND   [ ParentId ]   =   @ParentId  
None.gif                        
AND   [ SortOrder ]   <   @CurrentSortOrder  
None.gif                    
ORDER   BY   [ SortOrder ]   DESC
None.gif            ) 
AS  pt  ON  pt. [ TargetId ]   =  t. [ TargetId ]
None.gif        
None.gif        
-- print @ReplaceSortOrder;
None.gif
         -- print @ReplaceTargetId;
None.gif
         -- print @TargetId;
None.gif
         -- 替换操作
None.gif
         IF ( @ReplaceSortOrder   !=   - 1   AND   @ReplaceTargetId   !=   @TargetId )
None.gif        
BEGIN
None.gif            
-- 更新要替换项的SortOrder为当前值
None.gif
             UPDATE   [ ps_Targets ]   SET   [ SortOrder ]   =   @CurrentSortOrder  
None.gif                
WHERE   [ TargetId ]   =   @ReplaceTargetId
None.gif            
-- 更新当前项的SortOrder为要替换项的SortOrder值
None.gif
             UPDATE   [ ps_Targets ]   SET   [ SortOrder ]   =   @ReplaceSortOrder  
None.gif                
WHERE   [ TargetId ]   =   @TargetId
None.gif        
END
None.gif    
END
None.gif    
ELSE
None.gif    
BEGIN
None.gif        
-- 下移操作
None.gif
         -- 获取要替换的SortOrder和要替换的TargetId '>' 'ASC'
None.gif
         SELECT   @ReplaceSortOrder   =   COALESCE (t. [ SortOrder ] - 1 ),
None.gif            
@ReplaceTargetId   =   COALESCE (t. [ TargetId ] ' 00000000-0000-0000-0000-000000000000 ' )
None.gif            
FROM   [ ps_Targets ]  t  INNER   JOIN  (
None.gif                
SELECT   TOP   1   *   FROM   [ ps_Targets ]  
None.gif                    
WHERE   [ ApplicationId ]   =   @ApplicationId   AND   [ ParentId ]   =   @ParentId  
None.gif                        
AND   [ SortOrder ]   >   @CurrentSortOrder
None.gif                    
ORDER   BY   [ SortOrder ]   ASC
None.gif            ) 
AS  pt  ON  pt. [ TargetId ]   =  t. [ TargetId ]
None.gif
None.gif        
-- print @ReplaceSortOrder;
None.gif
         -- print @ReplaceTargetId;
None.gif
         -- print @TargetId;
None.gif
         -- 替换操作
None.gif
         IF ( @ReplaceSortOrder   !=   - 1   AND   @ReplaceTargetId   !=   @TargetId )
None.gif        
BEGIN
None.gif            
-- 更新要替换项的SortOrder为当前值
None.gif
             UPDATE   [ ps_Targets ]   SET   [ SortOrder ]   =   @CurrentSortOrder  
None.gif                
WHERE   [ TargetId ]   =   @ReplaceTargetId  
None.gif            
-- 更新当前项的SortOrder为要替换项的SortOrder值
None.gif
             UPDATE   [ ps_Targets ]   SET   [ SortOrder ]   =   @ReplaceSortOrder  
None.gif                
WHERE   [ TargetId ]   =   @TargetId
None.gif        
END
None.gif
None.gif    
END
None.gif
None.gif    
-- 更新修改时间
None.gif
     UPDATE   [ ps_Targets ]   SET   [ LastUpdatedDate ]   =   getdate ()  WHERE   [ TargetId ]   =   @TargetId
None.gif
None.gif
END
None.gif
None.gif

转载于:https://www.cnblogs.com/chenjunbiao/archive/2005/08/31/1760273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值