自动生成剩余编号字符串

原创 2004年08月09日 08:49:00

原帖地址:

http://community.csdn.net/Expert/topic/3220/3220744.xml?temp=.6029474

问题描述:

insert 主表 select 'Q',0000001,0000100,100,'0000001-0000100'?
union all select 'M',0000001,0000200,200,'0000001-0000200'

insert 子表 select 'Q',0000011,0000030,20
union all select 'Q',0000032,0000050,19
union all select 'Q',0000061,0000080,20
union all select 'M',0000001,0000100,100

如何用触发器在子表中插入每条记录时,更新主表的balance字段呢?

如上想得出的结果是:
id name  strat      end     amount   balance
1   Q    0000001   0000100     41    0000001-0000010,0000031-0000031,0000051-0000060,0000081-0000100   
2   M    0000001   0000200     100   0000101-0000200

----------------------------------------------------------------------------------

--测试数据
CREATE TABLE [dbo].[主表] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [name] [varchar] (50) NULL ,
 [strat] [varchar] (7) NULL ,
 [end] [varchar] (7) NULL ,
 [amount] [int] NULL ,
 [balance] [varchar] (200) NULL
)

CREATE TABLE [dbo].[子表] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [name] [varchar] (50) NULL ,
 [strat] [varchar] (7) NULL ,
 [end] [varchar] (7) NULL ,
 [amount] [int] NULL
)

insert 主表 select 'Q','0000001','0000100',100,'0000001-0000100' 
union all select 'M','0000001','0000200',200,'0000001-0000200'
go

--处理的触发器
create trigger tr_process on 子表
for insert,update,delete
as
select *,[balance]=cast(null as [varchar] (200))
into #t
from 子表 a
where exists(select 1 from inserted where name=a.name)
 or exists(select 1 from deleted where name=a.name)
order by name,[strat]

declare @name varchar(10),@end int,@re varchar(200)
update #t set @re=case @name when name
  then case when @end+1<[strat] then @re+','+right(10000001+@end,7)+'-'+right(9999999+[strat],7)
   else @re+'' end else '' end
 ,@end=[end],@name=name,[balance]=@re

update a set [balance]
 =case when a.[strat]<b.[strat] then a.[strat]+'-'+right(9999999+b.[strat],7) else '' end
  +case when a.[strat]<b.[strat] then b.[balance]
   else case when b.[balance]<>'' then stuff(b.[balance],1,1,'') else '' end end 
  +case when b.[end]<a.[end]
   then case when a.[strat]<b.[strat] or b.[balance]<>''
    then ',' else '' end+right(10000001+b.[end],7)+'-'+a.[end]
   else '' end
 ,[amount]=cast(a.[end] as int)-a.[strat]-b.[amount]+1
from 主表 a,(
 select name,[strat]=min([strat]),[end]=max([end]),[balance]=max([balance]),[amount]=sum([amount])
 from #t
 group by name
)b where a.name=b.name

--处理在子表中被全部删除的数据
if exists(select 1 from deleted a where not exists(select 1 from 子表 where name=a.name))
 update a set amount=cast(a.[end] as int)-a.[strat]+1
  ,[balance]=a.[strat]+'-'+a.[end]
 from 主表 a,(
  select distinct name from deleted a
  where not exists(select 1 from 子表 where name=a.name)
 )b where a.name=b.name
go

--插入子表数据
insert 子表 select 'Q','0000011','0000030',20
union all select 'Q','0000032','0000050',19
union all select 'Q','0000061','0000080',20
union all select 'M','0000051','0000100',50

--更新
update 子表 set name='M'
where ID=1

delete from 子表 where id in(1,3,4)
go

--显示处理结果
select * from 主表
select * from 子表
go

drop table 主表,子表

/*--测试结果

ID  name   strat   end     amount   balance                 
--- ------ ------- ------- -------- -------------------------------
1   Q      0000001 0000100 81       0000001-0000031,0000051-0000100
2   M      0000001 0000200 200      0000001-0000200

(所影响的行数为 2 行)

ID          name   strat   end     amount     
----------- ------ ------- ------- ----------
2           Q      0000032 0000050 19

(所影响的行数为 1 行)
--*/

自动生成剩余编号字符串

原帖地址:http://community.csdn.net/Expert/topic/3220/3220744.xml?temp=.6029474问题描述:insert 主表 select Q,00...
  • chenzhiya
  • chenzhiya
  • 2008年01月03日 15:13
  • 102

java单例模式自动生成编号

使用java单例模式自动生成编号
  • CSDN759322423
  • CSDN759322423
  • 2017年04月18日 16:48
  • 1125

java中自动生成编码

Java生成规律编码的思路 /*** * * getCommonBh:(获得通用的编号:前缀(一般是单位的前N位+当前时间(自定义格式)+格式化的sequence值:00001)). ...
  • Zhangxichao100
  • Zhangxichao100
  • 2017年02月24日 15:54
  • 3192

sql 自动生成编号函数

下面是一个用sql生成自动编号的函数,希望对大家有帮助。。/**   PoNumber----函数名   pono---- 字段名   po---表名字   **/create  function P...
  • pengfeihe0123
  • pengfeihe0123
  • 2011年02月21日 09:20
  • 2226

java中自动生成编码,例如18位,20位等

/*** * * getCommonBh:(获得通用的编号:前缀(一般是单位的前N位+当前时间(自定义格式)+格式化的sequence值:00001)). * @au...
  • u011410254
  • u011410254
  • 2015年07月21日 20:27
  • 5930

Java生成NO201601270001这样的流水编号

首先从数据库查询出已有的最大编号 拼成NO+当前时间格式的字符串 判断最大编号是否存在,最大编号中是否包含当天时间 如果最大编号不存在,则直接生成第一个编号NO201601270001 如果最大编号存...
  • jianyuerensheng
  • jianyuerensheng
  • 2016年01月27日 09:26
  • 6923

自动生成字母编号

第一次写博客,各位多包含,废话少说直接上代码,代码比较简单,很容易就能看明白。//字母自动编号 function AutoNumberByLetter(vNumber) { var vLett...
  • lzhlkl
  • lzhlkl
  • 2016年05月29日 23:19
  • 171

Oracle 自动生成标识列, 比如订单编号,学生ID

Oracle 自动生成标识列, 比如订单编号,学生ID
  • awenli
  • awenli
  • 2017年08月24日 16:24
  • 163

php 自动生成订单编号

php 自动生成订单编号有两种方法 方法一: 方法二: 
  • k8080880
  • k8080880
  • 2010年11月01日 15:50
  • 9009

自动生成编号

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy...
  • zhaozhijun0207
  • zhaozhijun0207
  • 2009年03月31日 09:16
  • 620
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自动生成剩余编号字符串
举报原因:
原因补充:

(最多只允许输入30个字)