gw_subject
id subject
01 木工
02 电工
03 水电工
…………
gw_address
id address
01 北京
02 上海
03 广州
04 天津
…………
gw_enter
id pici address subject exam_number(varchar 50)
1 200706 广州 木工 200706030100001
2 200706 北京 电工 200706010200001
3 200706 北京 电工 200706010200002
4 200706 北京 水电工 200706010300001
这里的exam_number的规则是:
pici + address编号 + 类别编号 +5位顺序编号
200706 01 03 000001
需要一个触发器。
当增加一条记录时,自动生成一个15位的exam_number。
并且当对里面的address或者subject作出变更的时候。
触发器也会捕捉到。并对后面的exam_number作出变更。
id subject
01 木工
02 电工
03 水电工
…………
gw_address
id address
01 北京
02 上海
03 广州
04 天津
…………
gw_enter
id pici address subject exam_number(varchar 50)
1 200706 广州 木工 200706030100001
2 200706 北京 电工 200706010200001
3 200706 北京 电工 200706010200002
4 200706 北京 水电工 200706010300001
这里的exam_number的规则是:
pici + address编号 + 类别编号 +5位顺序编号
200706 01 03 000001
需要一个触发器。
当增加一条记录时,自动生成一个15位的exam_number。
并且当对里面的address或者subject作出变更的时候。
触发器也会捕捉到。并对后面的exam_number作出变更。
on dbo.gw_enter
for Insert, UPDATE
as
declare @aa varchar(50)
begin
select @aa=pici+gw_address.id+gw_subject.id+right(5,'00000'+Convert(nvarchar,inserted.id))
from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join
gw_address on inserted.address=gw_subject.addressupdate gw_enter set exam_number=@aa from gw_enter inner join inserted on gw_enter.id=inserted.idend
on gw_enter
for insert,update
as
if update(pici) or update(address) or update(subject)
update a
set exam_number=a.pici+b.id+c.id+right('00000'+cast((select cast(right(max(exam_number),5) as int) from gw_enter where exam_number like a.pici+b.id+c.id+'%')+(select count(*) from inserted where pici=a.pici and address=a.address and subject=a.subject and id<=a.id) as varchar),5)
from gw_enter a,inserted i,gw_address b,gw_subject c
where a.id=i.id
and a.address=b.address
and a.subject=c.subjectgo
FOR insert
AS
begin
update gw_enter set gw_enter.exam_number = gw_enter.pici + b.id + c.id from gw_subject as b,gw_address as c,inserted as d where gw_enter.subject = c.subject and gw_enter.address = b.address and gw_enter.id = d.id
end
CREATE TRIGGER gw_enter_insert ON dbo.gw_enter
FOR update
AS
begin
update gw_enter set gw_enter.exam_number = gw_enter.pici + b.id + c.id from gw_subject as b,gw_address as c,inserted as d where gw_enter.subject = c.subject and gw_enter.address = b.address and gw_enter.id = d.id
end
不对啊。。
测试不成功。
CREATE trigger [dbo].[gw_enter_I]
on dbo.gw_enter
for Insert, UPDATE
as
declare @aa varchar(50)
begin
select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,inserted.id),5)
from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join
gw_address on inserted.address=gw_address.address
update gw_enter set exam_number=@aa from gw_enter inner join inserted on gw_enter.id=inserted.id
end修改一下
只考虑写出exam_number。
应该怎么写最简化?
---------- ---------- ---------- ---------- -----------------------------------------
8 200102 北京 电工 200102010200008(1 row(s) affected)
不知道你设置那些id数据类型的时候是设置的什么类型?
全部都是vchar吗?
如果不考虑变更address与subject。
只考虑写出exam_number。
应该怎么写最简化?
----------------------------------------------
触发器必须考虑一次操作多条记录的情况
所以,就算不考虑变更address与subject的情况,触发器也要这么写,没有多少可以简化的
最后那个5位顺序编号的时候有点问题。
不能直接取前面的ID。
如果最开始的那条数据
4 200706 北京 水电工 200706010300001
如果取ID号的话就会变成200706010300004了。
数据类型全部使用vchar。测试没多大的问题了。
就是这里这个序号的问题。
按照
CREATE trigger [dbo].[gw_enter_I]
on dbo.gw_enter
for Insert, UPDATE
as
declare @aa varchar(50)
begin
select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,inserted.id),5)
from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join
gw_address on inserted.address=gw_address.address
update gw_enter set exam_number=@aa from gw_enter inner join inserted on gw_enter.id=inserted.id
end
最后那个5位顺序编号的时候有点问题。
不能直接取前面的ID。
如果最开始的那条数据
4 200706 北京 水电工 200706010300001
如果取ID号的话就会变成200706010300004了。
数据类型全部使用vchar。测试没多大的问题了。
就是这里这个序号的问题。
你用inserted.id序号当然有问题了
那应该怎么写啊??
按照你写的触发器,
语法测试正常
但是就是没法使用。提示什么错误。
alter trigger [dbo].[gw_enter_I]
on dbo.gw_enter
for Insert, UPDATE
as
declare @aa varchar(50)
declare @id int
begin
select @id=max(right(exam_number,5)) from gw_enter where subject =(select top 1 subject from inserted)
select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,isnull(@id,0)+1),5)
from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join
gw_address on inserted.address=gw_address.address
update gw_enter set exam_number=@aa from gw_enter inner join inserted on gw_enter.id=inserted.id
end
+5位顺序编号
是不是按subject 分类之后的编号?