编写触发器遇到一点小问题(在线等待) (100分)

  • 主题发起人 wyxin2001
  • 开始时间
W

wyxin2001

Unregistered / Unconfirmed
GUEST, unregistred user!
需要对一张表编写插入和删除触发器
要求:1、插入触发器:第一条记录中记录号(jlh)由用户写入,以后没插入一条记录,
插入触发器都会在上一条记录的基础上加一。编写如下:
CREATE TRIGGER [ys_insert] ON [KJDA_YS]
FOR INSERT
AS
declare @rcnt int, @first float
select @rcnt=@@rowcount
if @rcnt=1
begin
select @first=jlh from KJDA_YS
end
if @rcnt>1
begin
update kjda_cp set jlh=@first+@@rowcount-1 where jlh=null
end
但是没有反应,不知道为什么?
2、删除触发器:删除一条记录其后面的记录号都自动减一,和其前面的记录号仍保持
连续。可不可以给一点提示,怎样知道删除记录的位置?如果能给出具体解决方案更好。
:)
 
if @rcnt=0 怎么办?
 
to jsxjd:
由用户直接输入记录号,所以插入第一条的时候触发器不起作用
 
关键在这
@@ROWCOUNT 返回受上一语句影响的行数(please reference online book)。
所以你的语句
select @rcnt=@@rowcount
@rcnt肯定等于0,当然就没有反应了,
你可以在插入时,看一下事件探测器中看一下有没有执行你的语句就知了
 
to 王公子:
我也使用过select @rcnt=count(*) from KJDA_YS
一样没有反应,不知道这又是什么原因?
 
在select @rcnt=@@rowcount 前先执行
select cnt(*) from ...
 
to jsxjd:
您的意思是不是先执行select count(*) from kjda_ys
再执行select @rcnt=@@rowcount
请问,它和我说的直接执行select @rcnt=count(*) from KJDA_YS有什么区别么?
 
要下班了,明天上午上班时间我会准时在这里等待各位大富翁的光临。:)
谢谢。:)
 
to wyxin2001
@rowcount 返回的是最近一次SQL 操作所影响的行数,
你执行的是 insert (SQL)操作所以返回的每次都是 1 ,
所以你执行不成功。要想知道删除的记录,你直接执行
select * from deleted ,这个表存放的是最后一次删除
的所有记录,可直接使用。 inserted 中存放的是最后
一次 insert的计录

 
to zhihui:
谢谢,我再试试看。:)
 
我按照各位大富翁的提示将插入触发器改为:
CREATE TRIGGER [ys_insert] ON [KJDA_YS]
FOR INSERT
AS
declare @rcnt int, @first float
select count(*) from KJDA_YS
select @rcnt=@@rowcount
if @rcnt=1
begin
select @first=jlh from KJDA_YS
end
if @rcnt>1
begin
update KJDA_YS set jlh=@first+@@rowcount-1
end
在我插入第一条,并且给出记录好初始值的情况下,仍然没有反应。
不知道为什么,请大富翁们再帮帮忙,很急,在线等待。:)

 
关键在你的@first变量上。因为你的@rcnt如果=1则执行select @first=jlh from KJDA_YS
而如果>1执行update KJDA_YS set jlh=@first+@@rowcount-1,这时你的@first值是null所以
jlh=@first+@@rowcount-1 也是null
 
to ericimex01:
我的表是从第一条记录开始输入的,所以@first不应该为空啊。能否提供一个解决
的方法。
 
可是每次触发时,这个触发器就相当于重新开始运行。
所以每次运行时@first都是NULL。
为什么不用max(jlh)+1?
 
to ericimex01:
谢谢,我试试。:)
 
CREATE TRIGGER [ys_insert] ON [KJDA_YS]
FOR INSERT
AS
declare @rcnt int, @first float
select count(*) from KJDA_YS
select @rcnt=@@rowcount
if @rcnt=1
begin
select @first=jlh from KJDA_YS
end
if @rcnt>1
begin
select @first=max(jlh) from KJDA_YS
update KJDA_YS set jlh=@first+1
end
还是不对啊?!
 
你里面没用的语句太多了。我帮你精简了一下,你试试,可以的。
CREATE TRIGGER [ys_insert] ON [KJDA_YS]
FOR INSERT
AS
declare @first float
select @first=max(jlh) from KJDA_YS
update KJDA_YS set jlh=@first+1 where jlh is null
 
因为你第一次加记录时jlh不是NULL,所以不需要判断@@rowcount,
update KJDA_YS set jlh=@first+1 where jlh is null不会影响到。
以后别入记录时不要对jlh赋值,就可以了。
 
to ericimex01:
太好了,插入的触发器可以实现功能了。非常感谢。
能不能在帮忙想想删除触发器该如何实现。:)
 
很简单,如下:
CREATE TRIGGER [ys_delete] ON [KJDA_YS]
FOR DELETE
AS
update KJDA_YS set jlh=jlh-1 where jlh>(select jlh from deleted)
 
顶部