/**//* * 功能:中断ID的连续处理 * * 适用:SQL Server 2000 / SQL Server 2005 * * 返回:NONE * * 作者:Flystone * * 日期:2008-05-13 * */-- 问题引入/**//*表﹕test 字段: u_no char(2), u_nameid char(5) ---u_no-----------u_nameid------- 01 A0001 02 B8921 03 F8762 . 99 ..... 比如我刪除了行66 就是u_no為66的行,表紀錄成了: ---u_no-----------u_nameid------- 01 A0001 02 B8921 03 F8762 . 65 67 . 99 ..... 我要讓u_no自己補齊刪除的數字﹐如下所示 ---u_no-----------u_nameid------- 01 A0001 02 B8921 03 F8762 . . . 65 66 . 98 ..... */--环境准备create table test(u_no char(2),u_nameid char(5))insert into test select '01','A0001' union select '02' , 'B8921' union select '03' , 'F8762' union select '04', 'C2345' union select '05', 'C2345' union select '06', 'C2345' union select '07', 'C2345' union select '08', 'C2345' union select '09', 'C2345'go--方法一:触发器create trigger tr_deleteidon testfor deleteasbegin declare @i int,@c int select @I = min(cast(u_no as int)),@c = count(1) from deleted update test set u_no = right('00'+ltrim(cast(u_no as int) - @c),2) where u_no > @iendgo--原始记录select * from test/**//*u_no u_nameid ---- -------- 01 A000102 B892103 F876204 C234505 C234506 C234507 C234508 C234509 C2345(所影响的行数为 9 行)*/--单条删除delete from test where u_no = '02'select * from test/**//*u_no u_nameid ---- -------- 01 A000102 F876203 C234504 C234505 C234506 C234507 C234508 C2345(所影响的行数为 8 行)*/--批量删除开始delete from test where u_no between '02' and '04'select * from test/**//*u_no u_nameid ---- -------- 01 A000102 C234503 C234504 C234505 C2345(所影响的行数为 5 行)*/--方法二:过程处理--重新准备数据drop table test --一定要删除哦,因为上面的表有触发器哦gocreate table test(u_no char(2),u_nameid char(5))insert into test select '01','A0001' union select '02' , 'B8921' union select '03' , 'C8762' union select '04', 'D2345' union select '05', 'E2345' union select '06', 'F2345' union select '07', 'G2345' union select '08', 'H2345' union select '09', 'I2345'gocreate proc proc_test@u_no varchar(2),@L intasbegin declare @i char(2) set @i = right('00'+ltrim(cast(@u_no as int) + @L - 1),2) delete from test where u_no between @u_no and @i update test set u_no = right('00'+ltrim(cast(u_no as int) - @L),2) where u_no > @u_noend go--原始记录select * from test/**//*u_no u_nameid ---- -------- 01 A000102 B892103 F876204 C234505 C234506 C234507 C234508 C234509 C2345(所影响的行数为 9 行)*/--单条删除exec proc_test '02',1select * from testgo/**//*u_no u_nameid ---- -------- 01 A000102 F876203 C234504 C234505 C234506 C234507 C234508 C2345(所影响的行数为 8 行)*/--批量删除开始exec proc_test '02' ,2select * from test/**//*u_no u_nameid ---- -------- 01 A000102 E234503 F234504 G234505 H234506 I2345(所影响的行数为 6 行)*/--清除环境drop table testdrop proc proc_test