表﹕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               .....用什么實現呢﹖觸發器﹖還有其他的方法沒?

解决方案 »

  1.   

    --下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
    --得到新编号的函数
    CREATE FUNCTION f_NextBH()
    RETURNS char(8)
    AS
    BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
    END
    GO--在表中应用函数
    CREATE TABLE tb(
    BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
    col int)--插入资料
    BEGIN TRAN
    INSERT tb(col) VALUES(1)
    INSERT tb(col) VALUES(2)
    INSERT tb(col) VALUES(3)
    DELETE tb WHERE col=3
    INSERT tb(col) VALUES(4)
    INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
    COMMIT TRAN--显示结果
    SELECT * FROM tb
    /*--结果
    BH         col 
    ---------------- ----------- 
    BH000001  1
    BH000002  2
    BH000003  4
    BH000004  14
    --*/
      

  2.   


    --1,u_NO_Char不要设为标识列;
    --2,表中新增两列:
    Alter Table [tb] Add [ID] IDENTITY(1,1)
    Alter Table [tb] Add Deleted bit Default 1
    --3,当你删除时,不要真正的删除数据;
    Update [tb] Set Deleted=0 where [id]=@ID
    --4,以后当你需要新增时,查找最小可用的u_No_Char
    select u_no_Char,* from tb where id=(select min(id) from tb where u_no_char=@u_no And Deleted=0)
    --执行新增:
    Insert Into [tb]...
      

  3.   

    其實獲取到刪除列的u_no
    再執行語句 update test set u_no = u_no -1 where u_no > N'" + 刪除列u_no + "'就完了﹐謝謝各位,分還是要給﹐晚點,畢竟學習了.
    因為是刪除一次﹐保存一次﹐所以不會出現同時刪除>1條紀錄的情況我發現liangCK出現的特別快...
      

  4.   

    给一个考虑批量的/*
     * 功能:中断ID的连续处理            *
     * 适用:SQL Server 2000 / SQL Server 2005           *
     * 返回:1相同0不相同                                 *
     * 作者: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_deleteid
    on test
    for delete
    as
    begin
        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 > @i
    end
    go
    --原始记录
    select * from test
    /*u_no u_nameid 
    ---- -------- 
    01   A0001
    02   B8921
    03   F8762
    04   C2345
    05   C2345
    06   C2345
    07   C2345
    08   C2345
    09   C2345(所影响的行数为 9 行)
    */
    --单条删除
    delete from test where u_no = '02'
    select * from test
    /*
    u_no u_nameid 
    ---- -------- 
    01   A0001
    02   F8762
    03   C2345
    04   C2345
    05   C2345
    06   C2345
    07   C2345
    08   C2345(所影响的行数为 8 行)
    */
    --批量删除开始
    delete from test where u_no between '02' and '04'
    select * from test/*u_no u_nameid 
    ---- -------- 
    01   A0001
    02   C2345
    03   C2345
    04   C2345
    05   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'
    go
    create proc proc_test
    @u_no varchar(2),
    @L    int
    as
    begin
    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_no
    end 
    go--原始记录
    select * from test
    /*u_no u_nameid 
    ---- -------- 
    01   A0001
    02   B8921
    03   F8762
    04   C2345
    05   C2345
    06   C2345
    07   C2345
    08   C2345
    09   C2345(所影响的行数为 9 行)
    */
    --单条删除
    exec proc_test '02',1
    select * from test
    go
    /*u_no u_nameid 
    ---- -------- 
    01   A0001
    02   F8762
    03   C2345
    04   C2345
    05   C2345
    06   C2345
    07   C2345
    08   C2345(所影响的行数为 8 行)
    */--批量删除开始
    exec proc_test '02' ,2
    select * from test
    /*
    u_no u_nameid 
    ---- -------- 
    01   A0001
    02   E2345
    03   F2345
    04   G2345
    05   H2345
    06   I2345(所影响的行数为 6 行)
    */
    --清除环境
    drop table test
    drop proc proc_test
      

  5.   

    test(u_no char(2),u_nameid char(5))
    /* u_no 為key值時,上面諸位說的恐怕就不行了吧.
    個人覺得思路應該是 ,刪掉u_no>= @no 的所有記錄
    ,然後在觸發器裡在處理將 u_no> @no 的紀錄,
    再依次insert 到 test 裡.
    */
      

  6.   

    test(u_no char(2),u_nameid char(5)) 
    /* u_no 為key值時,上面諸位說的恐怕就不行了吧. 
    個人覺得思路應該是 ,刪掉u_no>= @no 的所有記錄 
    ,然後在觸發器裡在處理將 u_no> @no 的紀錄, 
    再依次insert 到 test 裡. 
    */