CREATE TRIGGER [violation_id1] ON dbo.Violation
FOR INSERT, UPDATE, DELETE
AS
if @@rowcount=0 returnupdate violation set id=(select count(*) from violation where hphm=a.hphm and hpzldm=a.hpzldm and wfbh<=a.wfbh) from violation a用这个触发器太慢了,又没有其他的方法实现这个功能.或则改一下这个也可以.大家给点意见.先谢谢了!
FOR INSERT, UPDATE, DELETE
AS
if @@rowcount=0 returnupdate violation set id=(select count(*) from violation where hphm=a.hphm and hpzldm=a.hpzldm and wfbh<=a.wfbh) from violation a用这个触发器太慢了,又没有其他的方法实现这个功能.或则改一下这个也可以.大家给点意见.先谢谢了!
FOR INSERT, UPDATE, DELETE
AS
if @@rowcount=0 returnupdate a
set id=(select count(1) from violation where hphm=a.hphm and hpzldm=a.hpzldm and wfbh<=a.wfbh)
from violation a
FOR INSERT, UPDATE, DELETE
AS
if @@rowcount=0 returnupdate violation set id=(select count(*) from violation where hphm=a.hphm and hpzldm=a.hpzldm and wfbh<=a.wfbh) from violation a你的触发器本身就是一个死循环啊
加个 判断if (not update(id))
能直接帮我写出来吗? 我怎么会mssql的语法.谢谢!
能直接帮我写出来吗? 我不懂mssql的语法.谢谢!
不要误导,自己回去多试试触发器再来答题吧,update触发器里的update是不会再次触发触发器的。
说的对,非常感谢~!~另外我对你的问题问一下
你是要把所有的 violation 中的ID 都更新为同一个数吗?
update violation set id=(select count(*) from violation where hphm=a.hphm and hpzldm=a.hpzldm and wfbh<=a.wfbh) from violation a
的结果是更新为同一个数的如果是这样,
我只能给你优化一下了
1)取出UPDATE 类型,因为更新并不会影响ID的结果
2)select count(*) 改为 select count(hphm) 这样速度会提高
3)去除if @@rowcount=0 return,没有必要
你试试了,共同学习!
to:qingbo_hu(湖儿清清水)
不要误导,自己回去多试试触发器再来答题吧,update触发器里的update是不会再次触发触发器的。
--------------------------------------------------------湖儿清清水说得对!
楼主写的语句如果将数据库->属性->选项->递归触发器勾上就会死循环.--下面是测试代码
create table tt1(id int,name varchar(10))
go
insert into tt1
select 1,'aa'
go
create trigger tri_tt1 on tt1
for insert,update,delete
as
if @@rowcount=0 return
update tt1
set id=10go
update tt1
set id=55
/*
服务器: 消息 217,级别 16,状态 1,过程 tri_tt1,行 5
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
*/
号,生成顺序号填入id字段。
qingbo_hu(湖儿清清水) 说的 只能优化select count(hphm) 谢谢大家!