利用触发器实现标识列连续。(支持批量插入)

  1. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ttt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
  2. drop table [dbo].[ttt]
  3. GO
  4. /****** Object:  Table [dbo].[ttt]    Script Date: 2008-12-15 17:11:26 ******/
  5. CREATE TABLE [dbo].[ttt] (
  6.     [id] [int] IDENTITY (1, 1) NOT NULL ,
  7.     [name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
  8.     [time] [datetime] NULL 
  9. ) ON [PRIMARY]
  10. GO
  11. ALTER TABLE [dbo].[ttt] ADD 
  12.     CONSTRAINT [PK_ttt] PRIMARY KEY  CLUSTERED 
  13.     (
  14.         [id]
  15.     )  ON [PRIMARY] 
  16. GO
  17. insert into ttt(name,time) values('logan',getdate());
  18. insert into ttt(name,time) values('peter',getdate());
  19. insert into ttt(name,time) values('man',getdate());
  20. insert into ttt(name,time) values('lida',getdate());
  21. insert into ttt(name,time) values('fcuandy',getdate());
  22. select * from ttt
  23. /*
  24. 1   logan   2008-12-15 17:36:37.780
  25. 2   peter   2008-12-15 17:36:37.780
  26. 3   man 2008-12-15 17:36:37.780
  27. 4   lida    2008-12-15 17:36:37.780
  28. 5   fcuandy 2008-12-15 17:36:37.793
  29. */
  30. GO
  31. CREATE TRIGGER tr ON ttt
  32. INSTEAD OF INSERT
  33. AS
  34.     SET IDENTITY_INSERT ttt ON
  35.     DECLARE @n INT
  36.     SELECT @n=MAX(id) FROM ttt
  37.     ;WITH fc AS
  38.     (
  39.         SELECT n=1
  40.         UNION ALL
  41.         SELECT nn=n+1 FROM fc WHERE n<@n
  42.     ),fc1 AS
  43.     (
  44.     SELECT n FROM fc a
  45.     LEFT JOIN ttt b
  46.         ON a.n = b.id
  47.         WHERE b.id IS NULL
  48.     )
  49.     INSERT ttt(id,name,time) SELECT n,name,time
  50.         FROM
  51.         (SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()) idx,n FROM fc1) a
  52.     INNER JOIN
  53.         (
  54.         SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
  55.         ) b
  56.         ON a.idx=b.idx
  57.     DECLARE @r INT
  58.     SELECT @r=@@ROWCOUNT
  59.     
  60.     SET IDENTITY_INSERT ttt OFF
  61.         INSERT ttt(name,time) SELECT name,time FROM 
  62.             (
  63.                 SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
  64.             ) x
  65.             WHERE idx>@r
  66.     
  67. GO
  68. DELETE FROM ttt WHERE name = 'peter' OR name='lida'
  69. GO
  70. INSERT ttt SELECT 'xxx',getdate()
  71. INSERT ttt SELECT 'yyy',GETDATE()
  72. GO
  73. SELECT * FROM ttt
  74. /*
  75. 1   logan   2008-12-15 17:37:20.967
  76. 2   xxx 2008-12-15 17:37:21.013
  77. 3   man 2008-12-15 17:37:20.967
  78. 4   yyy 2008-12-15 17:37:21.030
  79. 5   fcuandy 2008-12-15 17:37:20.967
  80. */
  81. DELETE FROM ttt WHERE name ='xxx' OR name='yyy'
  82. INSERT ttt SELECT 'roy_88',GETDATE() UNION ALL SELECT 'limpire',GETDATE() UNION ALL SELECT '熊',GETDATE()
  83. SELECT * FROM ttt
  84. /*
  85. 1   logan   2008-12-15 17:38:29.450
  86. 2   roy_88  2008-12-15 17:38:29.530
  87. 3   man 2008-12-15 17:38:29.467
  88. 4   limpire 2008-12-15 17:38:29.530
  89. 5   fcuandy 2008-12-15 17:38:29.467
  90. 6   熊   2008-12-15 17:38:29.530
  91. */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值