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用这个触发器太慢了,又没有其他的方法实现这个功能.或则改一下这个也可以.大家给点意见.先谢谢了!

解决方案 »

  1.   

    CREATE TRIGGER [violation_id1] ON dbo.Violation 
    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
      

  2.   

    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你的触发器本身就是一个死循环啊
    加个 判断if (not update(id))
      

  3.   

    qingbo_hu(湖儿清清水)
    能直接帮我写出来吗?  我怎么会mssql的语法.谢谢!
      

  4.   

    qingbo_hu(湖儿清清水)
    能直接帮我写出来吗?  我不懂mssql的语法.谢谢!
      

  5.   

    to:qingbo_hu(湖儿清清水) 
    不要误导,自己回去多试试触发器再来答题吧,update触发器里的update是不会再次触发触发器的。
      

  6.   

    ctoygl(又高了)
    说的对,非常感谢~!~另外我对你的问题问一下
    你是要把所有的 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,没有必要
    你试试了,共同学习!
      

  7.   

    ctoygl(又高了) ( ) 信誉:100    Blog   加为好友  2007-4-26 11:00:03  得分: 0  
       
    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)。
    */
      

  8.   

    wfbh 是唯一的数字编号(是根据时间顺序排列的)。这个触发器的功能是,根据相同的(hphm)
    号,生成顺序号填入id字段。
    qingbo_hu(湖儿清清水) 说的  只能优化select count(hphm)  谢谢大家!