zoukankan      html  css  js  c++  java
  • TSQL 自定义流水号 触发器 j9988

    
    drop table dbo.num_tb
    drop table dbo.tb
    create table num_tb(d datetime, id int)
    insert num_tb
    select '2004-01-01', 1
    CREATE TABLE [tb]
    (
        [AutoID] [bigint] IDENTITY(1,1) NOT NULL,
        [id] [varchar](20) NULL,
        [name] [varchar](10) NULL,
        [CreateTime] [datetime] default getdate(),
        CONSTRAINT [PK_tb] PRIMARY KEY CLUSTERED 
        (
            [AutoID] ASC
        )
    ) ON [PRIMARY]
    create unique nonclustered index idx_id_tb on tb(id)
    go
    create trigger tri_tb on tb
    INSTEAD OF INSERT
    as
    begin
        set nocount on
        declare @i int
                --,@id varchar(20)
                ,@j int
        select
            @i = count(*)
        from inserted
        begin tran
            declare @now varchar(14), @latest varchar(14)
            update num_tb with(TABLOCKX)
            set 
                @now = replace(replace(replace(convert(varchar(19), getdate(), 120), '-', ''), ' ',''), ':', ''),
                @latest = replace(replace(replace(convert(varchar(19), d, 120), '-', ''), ' ',''), ':', ''),
                id = (
                        case
                            when  @latest = @now
                                    then id + @i
                            else
                                    @i
                        end
                    ),
                @j = (
                        case
                            when @latest = @now
                                then id
                            else
                                0
                        end
                    ),
                    d = getdate()
        commit tran
        select *
            into #t
        from inserted
        update #t
        set id = @now
                 + right('000000' + rtrim(@j), 6)
            ,@j = @j + 1
        insert tb (id, name)
        select id,name 
        from #t
    end
    go
    --创建表
    go
    --插入记录测试
    declare @i int
    set @i=0
    while @i< = 1000
    begin
        insert into tb(name) values('张三')
        insert into tb(name)
        select '张四' union all
        select '张五' union all
        select '张六' union all
        select '张七' union all
        select '张八' union all
        select '张九' union all
        select '张十'
        set @i = @i + 1
    end
    select MAX(id),MIN(id),COUNT(*),
    MAX(AutoID),MIN(AutoID),MAX(CreateTime),MIN(CreateTime)
    from tb
    group by LEFT(id, 14)
    order by 3 desc
    select * from tb a
    where exists 
    (select 1 from tb where id > a.id and AutoID < a.AutoID)
    --truncate table tb
    
    
  • 相关阅读:
    最长严格上升子序列
    01背包
    八数码难题
    跳石头
    立体图
    质因数分解 2012年NOIP全国联赛普及组
    多项式输出 2009年NOIP全国联赛普及组
    绕钉子的长绳子
    数星星
    进制转换
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/1958831.html
Copyright © 2011-2022 走看看