为了账号安全,请及时绑定邮箱和手机立即绑定

实现记录排序

标签:
产品

以前曾经在asp.net实现记录排序功能,参考:http://www.cnblogs.com/insus/articles/1406440.html前端实现,写得很复杂。

现在,把它改为触发器来实现,那就简单多了。由于时隔已久,原实例样版代码已经找不到了,只有再写一样功能一样的表。这个表实现与记录插入功能,可以参考相关链接:

http://www.cnblogs.com/insus/articles/1921391.html

http://www.cnblogs.com/insus/articles/1921465.html

http://www.cnblogs.com/insus/articles/1921618.html

http://www.cnblogs.com/insus/articles/1922387.html

 

完整记录排序触发器代码(更新记录),

代码

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT [name] FROM sysobjects WHERE [name] = 'tri_OrderDemo_Update' AND TYPE = 'TR')
   DROP TRIGGER [dbo].[tri_OrderDemo_Update]
GO

CREATE TRIGGER [dbo].[tri_OrderDemo_Update] ON [dbo].[OrderDemo]
FOR UPDATE
AS
--宣告变量,存储更新记录的主键,[Num]字段的旧值,新值,以及所有记录的[Num]字段的最大值与最小值,最小值设为1
DECLARE @PK INT,@OldValue INT, @NewValue INT,@MaxValue INT,@MinValue INT = 1
--从deleted虚拟表找主键和[Num]字段到旧值
SELECT @PK = [OrderDemoId],@OldValue = [Num] FROM deleted
--从inserted虚拟表找[Num]字段到新值
SELECT @NewValue = [Num] FROM inserted 
--从表[OrdeDemo]找到最大值
SELECT @MaxValue = MAX([Num]) FROM [dbo].[OrderDemo]


BEGIN    
    --由大的排序号,排至小的排序号
     IF (@NewValue < @OldValue)
        UPDATE [dbo].[OrderDemo] SET [Num] = [Num] + 1 WHERE [OrderDemoId] IN (SELECT [OrderDemoId] FROM [dbo].[OrderDemo] WHERE [Num] BETWEEN @NewValue AND (@OldValue - 1)) AND [OrderDemoId] <> @PK
    --由小的排序号,排至大的排序号
    ELSE IF (@NewValue > @OldValue)
        UPDATE [dbo].[OrderDemo] SET [Num] = [Num] - 1 WHERE [OrderDemoId] IN (SELECT [OrderDemoId] FROM [dbo].[OrderDemo] WHERE [Num] BETWEEN (@OldValue + 1) AND @NewValue) AND [OrderDemoId] <> @PK
    ELSE
      --新值与旧值一样,不作更新@NewValue = @OldValue      
      RETURN
END

 

 删除记录触发器,

代码

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF EXISTS (SELECT [name] FROM sysobjects WHERE [name] = 'tri_OrderDemo_Delete' AND TYPE = 'TR')
   DROP TRIGGER [dbo].[tri_OrderDemo_Delete]
GO


CREATE TRIGGER [dbo].[tri_OrderDemo_Delete] ON [dbo].[OrderDemo]
FOR DELETE
AS
--宣告变量,存储删除记录的[Num]字段的值
DECLARE @Value INT,@MaxValue INT
--从deleted虚拟表找主键和[Num]字段值
SELECT @Value = [Num] FROM deleted
SELECT @MaxValue = MAX([Num]) FROM [dbo].[OrderDemo]

BEGIN        
     IF (@Value < @MaxValue)
        UPDATE [dbo].[OrderDemo] SET [Num] = [Num] - 1 WHERE [OrderDemoId] IN (SELECT [OrderDemoId] FROM [dbo].[OrderDemo] WHERE [Num] BETWEEN @Value + 1 AND @MaxValue)
END

 

 

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消