表结构如:

TacticID uniqueidentifier
ParentTacticID uniqueidentifier
EnterpriseUID uniqueidentifier
Name nvarchar(256)
SortOrder int

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

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

    --获取当前的SortOrder值
    SELECT @currentSortValue = SortOrder, @ParentTacticID = ParentTacticID FROM EMB_Performance_Tactic WHERE TacticID = @TacticID 
    
    --上移还是下移
    IF (@MoveUp = 1)
        BEGIN
        --上移操作
            --获取要替换的SortOrder
            SELECT @replaceSortValue = COALESCE(t.SortOrder, -1), @replaceTacticID = COALESCE(t.TacticID, '{00000000-0000-0000-0000-000000000000}')
                FROM EMB_Performance_Tactic t
                    inner join (
                        select top 1 * 
                        from EMB_Performance_Tactic 
                        WHERE ParentTacticID = @ParentTacticID and SortOrder < @currentSortValue order by SortOrder DESC
                    ) as pf on 
                        pf.TacticID = t.TacticID

            if( @replaceSortValue != -1 )
            begin    
                UPDATE EMB_Performance_Tactic SET SortOrder = @currentSortValue WHERE TacticID = @replaceTacticID --更新要替换项的SortOrder为当前值
                UPDATE EMB_Performance_Tactic SET SortOrder = @replaceSortValue WHERE TacticID = @TacticID --更新当前项的SortOrder为要替换项的SortOrder值
            END 
        END
    ELSE
        BEGIN
        --下移操作
            SELECT @replaceSortValue = COALESCE(t.SortOrder, -1), @replaceTacticID = COALESCE(t.TacticID, '00000000-0000-0000-0000-000000000000')
                FROM EMB_Performance_Tactic t
                    inner join (
                        select top 1 * 
                        FROM EMB_Performance_Tactic 
                        WHERE ParentTacticID = @ParentTacticID and SortOrder > @currentSortValue order by SortOrder ASC                
                    ) as pf on 
                        pf.TacticID = t.TacticID


            if( @replaceSortValue != -1 )
            BEGIN        
                UPDATE EMB_Performance_Tactic SET SortOrder = @currentSortValue WHERE TacticID = @replaceTacticID
                UPDATE EMB_Performance_Tactic SET SortOrder = @replaceSortValue WHERE TacticID = @TacticID
            END
        END
    
END

/**//*  COALESCE用法。
1、返回多个表达式中非空值的数据,如果所有表达式均为Null,则返回Null
2、多表达式必须是相同类型,或者可以隐性转换为相同类型。
*/
GO

http://www.ruiya.com

附加另一个例子:
1.数据表设计如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[RedirectService_Category](
    [CategoryID] [int] IDENTITY(1,1) NOT NULL,
    [ParentID] [int] NOT NULL,
    [Name] [nvarchar](256) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [Description] [nvarchar](2000) COLLATE Chinese_PRC_CI_AS NULL,
    [IsEnabled] [bit] NOT NULL CONSTRAINT [DF_RedirectService_Category_IsEnabled]  DEFAULT ((1)),
    [SortOrder] [int] NOT NULL CONSTRAINT [DF_RedirectService_Category_SortOrder]  DEFAULT ((1)),
    [CreateDate] [datetime] NOT NULL CONSTRAINT [DF_RedirectService_Category_CreateDate]  DEFAULT (getdate()),
    [LastUpdatedDate] [datetime] NOT NULL CONSTRAINT [DF_RedirectService_Category_LastUpdatedDate]  DEFAULT (getdate()),
 CONSTRAINT [PK_RedirectService_Category] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

2.存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        RedirectService_Category_UpdateSortOrder
-- Create date: 2006-01-06
-- Description:    更新分类的排序ID
-- =============================================
CREATE PROCEDURE [dbo].[RedirectService_Category_UpdateSortOrder]
(
    @CategoryID int,    --对其操作的分类ID
    @MoveUp bit            --是否向上移动
)
AS
BEGIN
    SET Transaction Isolation Level Read UNCOMMITTED--设置事务
    BEGIN    
    SET NOCOUNT ON;

    --定义变量
    DECLARE @CurrentSortOrder int        --当前SortOrder值
    DECLARE @ParentID int                --当前父分类ID
    DECLARE @ReplaceSortOrder int        --要替换的SortOrder值
    DECLARE @ReplaceCategoryID int        --要替换的CategoryID

    --为变量赋值
    SELECT @CurrentSortOrder = [SortOrder], @ParentID = [ParentID]
        FROM [RedirectService_Category] WHERE [CategoryID] = @CategoryID

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

        --替换操作
        IF(@ReplaceSortOrder != -1 AND @ReplaceCategoryID != -1)
        BEGIN
            --更新要替换项的SortOrder为当前值
            UPDATE [RedirectService_Category] SET [SortOrder] = @CurrentSortOrder 
                WHERE [CategoryID] = @ReplaceCategoryID
            --更新当前项的SortOrder为要替换项的SortOrder值
            UPDATE [RedirectService_Category] SET [SortOrder] = @ReplaceSortOrder 
                WHERE [CategoryID] = @CategoryID
        END
    END

    END
END

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

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

-- =============================================
-- Author:        BillChen
-- Create date: 2007-05-15
-- Description:    ps_Targets_UpdateSortOrder
-- =============================================
CREATE PROCEDURE [dbo].[ps_Targets_UpdateSortOrder]
(
    @TargetId uniqueidentifier,    --对其操作的目标Id
    @MoveUp bit                    --是否向上移动
)
AS
SET Transaction Isolation Level Read UNCOMMITTED --设置事务
BEGIN
    SET NOCOUNT ON;

    --定义变量
    DECLARE @CurrentSortOrder int                --当前SortOrder值
    DECLARE @ParentId uniqueidentifier            --当前父分类ID
    DECLARE @ReplaceSortOrder int                --要替换的SortOrder值
    DECLARE @ReplaceTargetId uniqueidentifier    --要替换的TargetId
    DECLARE @ApplicationId    uniqueidentifier    --当前节点所属的ApplicationId
    
    --为变量赋值
    SELECT @CurrentSortOrder = [SortOrder], @ParentId = [ParentId], @ApplicationId = [ApplicationId] 
        FROM [ps_Targets] WHERE [TargetId] = @TargetId

    --上移还是下移
    IF (@MoveUp = 1)
    BEGIN
        --上移操作
        --获取要替换的SortOrder和要替换的TargetId '<' 'DESC'
        SELECT @ReplaceSortOrder = COALESCE(t.[SortOrder], -1),
            @ReplaceTargetId = COALESCE(t.[TargetId], '00000000-0000-0000-0000-000000000000')
            FROM [ps_Targets] t INNER JOIN (
                SELECT TOP 1 * FROM [ps_Targets] 
                    WHERE [ApplicationId] = @ApplicationId AND [ParentId] = @ParentId 
                        AND [SortOrder] < @CurrentSortOrder 
                    ORDER BY [SortOrder] DESC
            ) AS pt ON pt.[TargetId] = t.[TargetId]
        
        --print @ReplaceSortOrder;
        --print @ReplaceTargetId;
        --print @TargetId;
        --替换操作
        IF(@ReplaceSortOrder != -1 AND @ReplaceTargetId != @TargetId)
        BEGIN
            --更新要替换项的SortOrder为当前值
            UPDATE [ps_Targets] SET [SortOrder] = @CurrentSortOrder 
                WHERE [TargetId] = @ReplaceTargetId
            --更新当前项的SortOrder为要替换项的SortOrder值
            UPDATE [ps_Targets] SET [SortOrder] = @ReplaceSortOrder 
                WHERE [TargetId] = @TargetId
        END
    END
    ELSE
    BEGIN
        --下移操作
        --获取要替换的SortOrder和要替换的TargetId '>' 'ASC'
        SELECT @ReplaceSortOrder = COALESCE(t.[SortOrder], -1),
            @ReplaceTargetId = COALESCE(t.[TargetId], '00000000-0000-0000-0000-000000000000')
            FROM [ps_Targets] t INNER JOIN (
                SELECT TOP 1 * FROM [ps_Targets] 
                    WHERE [ApplicationId] = @ApplicationId AND [ParentId] = @ParentId 
                        AND [SortOrder] > @CurrentSortOrder
                    ORDER BY [SortOrder] ASC
            ) AS pt ON pt.[TargetId] = t.[TargetId]

        --print @ReplaceSortOrder;
        --print @ReplaceTargetId;
        --print @TargetId;
        --替换操作
        IF(@ReplaceSortOrder != -1 AND @ReplaceTargetId != @TargetId)
        BEGIN
            --更新要替换项的SortOrder为当前值
            UPDATE [ps_Targets] SET [SortOrder] = @CurrentSortOrder 
                WHERE [TargetId] = @ReplaceTargetId 
            --更新当前项的SortOrder为要替换项的SortOrder值
            UPDATE [ps_Targets] SET [SortOrder] = @ReplaceSortOrder 
                WHERE [TargetId] = @TargetId
        END

    END

    --更新修改时间
    UPDATE [ps_Targets] SET [LastUpdatedDate] = getdate() WHERE [TargetId] = @TargetId

END

转载于:https://www.cnblogs.com/BillChen/archive/2005/08/31/227115.html

一个根据SortOrder控制排序的存储过程相关推荐

  1. C#实现一个万物皆可排序的队列

    需求 产品中需要向不同的客户推送数据,原来的实现是每条数据产生后就立即向客户推送数据,走的的是HTTP协议.因为每条数据都比较小,而数据生成的频次也比较高,这就会频繁的建立HTTP连接,而且每次HTT ...

  2. js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。...

    1.js实现随机选取[10,100)中的10个整数,存入一个数组,并排序. 1 <!DOCTYPE html> 2 <html lang="en"> 3 & ...

  3. Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串

    **7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串.编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串 题目 题目描述 破题 代码 运行实例 题目 题目描 ...

  4. 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。...

    第 14 题(数组): 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意 ...

  5. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [{name ...

  6. java数组按某个值排序_Js--使用sort根据数组中对象的某一个属性值进行排序

    现货深度学习之tensorflow原理样本 87.45元 包邮 (需用券) 去购买 > Js--使用sort根据数组中对象的某一个属性值进行排序 博客说明 文章所涉及的资料来自互联网整理和个人总 ...

  7. mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程

    查询节点的所有父节点,按层级排序的存储过程 父子关系表结构: `parentnode` int(11) ,-- 父节点 `node` int(11)  ,  -- 节点 `isparent` int( ...

  8. android升序降序按钮,创建一个按钮,将排序MYSQL查询升序和降序

    我是一名学生编码器. 我想创建一个排序按钮,当按下时,按升序排序MYSQL查询.然后再次按下时,它将按降序排列.对,现在,它只是显示升序和降序表背靠背.创建一个按钮,将排序MYSQL查询升序和降序 形 ...

  9. linux 无法实例化类,linux – 有没有办法将两个实例化的systemd服务作为一个单元进行控制?...

    我有一些 python Web服务,我正试图在Fedora 15机器上运行.它们由paster运行,启动它们的唯一区别是它们读取的配置文件. 这似乎非常适合systemd的实例化服务,但我希望能够将它 ...

  10. 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。

    原文转自:http://blog.csdn.net/u013322907/article/details/38300711 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们 ...

最新文章

  1. 使iPhone手机持续振动
  2. ASP,VBScript常用的内置函数,lbound(),ubound(),int(),fix(),rnd(),instr(),instrrec(),,
  3. Jenkins:配置信息变更历史
  4. 光流 速度_[论文笔记] FlowNet 光流估计
  5. 使用 rsync / scp 命令下载linux文件,显示网速和进度
  6. E:K-periodic Garland(DP)
  7. 【Modern OpenGL】坐标系统 Coordinate Systems
  8. 用命令行方式配置JAVA系统变量
  9. php从注册列表卸载,MSSQL_彻底删除SQL Server注册表的方法,一般在卸载完数据库时,大家 - phpStudy...
  10. HDOJ-1050-Moving Tables(nyoj220)
  11. 个人简历模板(网页版)
  12. 块/文件/对象三种存储的优缺点
  13. OCiOS开发:汉字转拼音
  14. 配对碱基链(C语言)
  15. 基于Python的自动聊天机器人
  16. Beyond Part Models: Person Retrieval with Refined Part Pooling (ECCV2018)
  17. pdf转word ocr_OCR免费识别撞上PDF免费转WORD,这下尴尬了!
  18. JSP————详解jsp标签
  19. 潮起潮落,自助餐还是被“吃”垮了
  20. 虚漠鸿蒙什么意思,好!妙哉妙哉!张济所作之诗不仅符合题意,更是言出了万物伊始乃...

热门文章

  1. Solr Windows环境安装配置
  2. 对第三组博客的检查情况
  3. [bzoj2299][HAOI2011]向量
  4. 关于应用的外部接口设计心得
  5. php工程师各大公司要求
  6. 关闭腾讯QQ游戏后跳出的广告
  7. 解题报告 poj 1087
  8. Trustdata:《2018年Q1中国移动互联网行业发展分析报告》
  9. Android找工作系列之事件传递机制
  10. 思科室外AP无法注册到WLC