一个根据SortOrder控制排序的存储过程
TacticID | uniqueidentifier |
ParentTacticID | uniqueidentifier |
EnterpriseUID | uniqueidentifier |
Name | nvarchar(256) |
SortOrder | int |
其中有父子关系和以SortOrder进行排序,以下的存储过程用于控制同级下的排序更新。
(
@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.数据表设计如下:
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.存储过程:
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 附加另处一个例子
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]
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控制排序的存储过程相关推荐
- C#实现一个万物皆可排序的队列
需求 产品中需要向不同的客户推送数据,原来的实现是每条数据产生后就立即向客户推送数据,走的的是HTTP协议.因为每条数据都比较小,而数据生成的频次也比较高,这就会频繁的建立HTTP连接,而且每次HTT ...
- js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。...
1.js实现随机选取[10,100)中的10个整数,存入一个数组,并排序. 1 <!DOCTYPE html> 2 <html lang="en"> 3 & ...
- Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串
**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串.编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串 题目 题目描述 破题 代码 运行实例 题目 题目描 ...
- 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。...
第 14 题(数组): 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意 ...
- js sort方法根据数组中对象的某一个属性值进行排序(实用方法)
js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [{name ...
- java数组按某个值排序_Js--使用sort根据数组中对象的某一个属性值进行排序
现货深度学习之tensorflow原理样本 87.45元 包邮 (需用券) 去购买 > Js--使用sort根据数组中对象的某一个属性值进行排序 博客说明 文章所涉及的资料来自互联网整理和个人总 ...
- mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程
查询节点的所有父节点,按层级排序的存储过程 父子关系表结构: `parentnode` int(11) ,-- 父节点 `node` int(11) , -- 节点 `isparent` int( ...
- android升序降序按钮,创建一个按钮,将排序MYSQL查询升序和降序
我是一名学生编码器. 我想创建一个排序按钮,当按下时,按升序排序MYSQL查询.然后再次按下时,它将按降序排列.对,现在,它只是显示升序和降序表背靠背.创建一个按钮,将排序MYSQL查询升序和降序 形 ...
- linux 无法实例化类,linux – 有没有办法将两个实例化的systemd服务作为一个单元进行控制?...
我有一些 python Web服务,我正试图在Fedora 15机器上运行.它们由paster运行,启动它们的唯一区别是它们读取的配置文件. 这似乎非常适合systemd的实例化服务,但我希望能够将它 ...
- 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。
原文转自:http://blog.csdn.net/u013322907/article/details/38300711 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们 ...
最新文章
- 使iPhone手机持续振动
- ASP,VBScript常用的内置函数,lbound(),ubound(),int(),fix(),rnd(),instr(),instrrec(),,
- Jenkins:配置信息变更历史
- 光流 速度_[论文笔记] FlowNet 光流估计
- 使用 rsync / scp 命令下载linux文件,显示网速和进度
- E:K-periodic Garland(DP)
- 【Modern OpenGL】坐标系统 Coordinate Systems
- 用命令行方式配置JAVA系统变量
- php从注册列表卸载,MSSQL_彻底删除SQL Server注册表的方法,一般在卸载完数据库时,大家 - phpStudy...
- HDOJ-1050-Moving Tables(nyoj220)
- 个人简历模板(网页版)
- 块/文件/对象三种存储的优缺点
- OCiOS开发:汉字转拼音
- 配对碱基链(C语言)
- 基于Python的自动聊天机器人
- Beyond Part Models: Person Retrieval with Refined Part Pooling (ECCV2018)
- pdf转word ocr_OCR免费识别撞上PDF免费转WORD,这下尴尬了!
- JSP————详解jsp标签
- 潮起潮落,自助餐还是被“吃”垮了
- 虚漠鸿蒙什么意思,好!妙哉妙哉!张济所作之诗不仅符合题意,更是言出了万物伊始乃...