自动生成剩余编号字符串

原创 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 行)
--*/

CAD插件,自动生成编号

  • 2017年07月01日 23:43
  • 88KB
  • 下载

存储过程自动生成项目编号

  • 2013年11月01日 12:30
  • 2KB
  • 下载

Oracle 自动生成编号(实现sqlserver自增长字段)

oracle自动编号 在access中有自动编号的数据类型,MSSQL和MYSQL也都有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值,而oracle没有自动增长的数据类型,我们...
  • dingxy
  • dingxy
  • 2011年12月23日 09:50
  • 730

自动生成编号【sql】

  • 2010年01月25日 17:00
  • 826B
  • 下载

如何解决用EndNote插入文献时无法自动生成右上角编号(完美解决加截图)

如何解决用EndNote插入文献时无法自动生成右上角编号(完美解决加截图)  (2011-07-06 20:22:55) 标签:  小数码植物摄影   zjp...

软工写文档熟练使用word很重要——自动生成编号

软工在写文档的时候经常会写成类似下图这种格式 这样看起来既美观有整齐 如果自己手动敲那些序号的话 一容易丢啦 二容易格式不统一从而造成排版混乱  我只能说word是个奇迹...

CCBPM(CCFlow与JFlow)中如何让表单字段自动生成编号

最近好多ccflow与jflow的爱好者问我,怎么才能让表单字段自动生成编号。 现在,通过一个完整的设计步骤与流程实例,向大家重新介绍一下。   在CCBPM中,将这种自动生成编号的行为称为:单...
  • jflows
  • jflows
  • 2015年12月11日 19:29
  • 1009

自动生成已有部门的编号-RowNumber+Partition

背景:   原本数据库中已经存在 Unit (部门表),仅有一些常用字段(部门ID、部门名称、父部门ID、部门级别之类的)。现在需要两个新的字段,存储部门的编号,如父部门:001,子部门:00100...
  • ceekor
  • ceekor
  • 2014年12月06日 16:21
  • 286

word中自动生成参考文献引用及自动更新文献编号

参考: http://jingyan.baidu.com/article/4e5b3e1952739291901e2495.html http://qiusuoge.com/6331.html ...
  • fandroid
  • fandroid
  • 2014年12月21日 15:44
  • 10157
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自动生成剩余编号字符串
举报原因:
原因补充:

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