因為你創建的是update 觸發器﹐當你update時﹐運行存儲過程p_1﹐插入一條記錄﹐得到 4    bbbb記錄﹐
繼續往下運行又插入一條記錄"5   aaa"你的id 是自動產生的

解决方案 »

  1.   

    --按你的触发器写法,结果没错啊create trigger tud on a
    for update
    as
    exec p_1            --调用存储过程,存储过程插入一条记录
    insert a(code)      --调用完存储过程后,回到触发器继续执行,这样就是一个update插入了两条记录
    values('aaa')
      

  2.   

    --触发器问题!
    --测试数据如下
    create table a(i int identity(1,1),code varchar(10))
    go--创建触发器
    create trigger tud on a
    for update
    as
    exec p_1
    insert a(code)
    values('aaa')
    go--建储过程
    create proc p_1
    as
    alter table a disable trigger all
    insert a
    values('bbbb')
    alter table a enable trigger  all
    go--建测试数据
    insert into a select 'a'--问题是为何执行下面的语句时,插入了两条记录,trigger tud 好象执行了两次!
    update a
    set code = 'aa'
    where i = 1select * from a/*
    i           code       
    ----------- ---------- 
    1           aa
    2           bbbb
    3           aaa(所影响的行数为 3 行)
    */godrop table a
    drop proc p_1
      

  3.   

    请在最后执行时,不加go试试,即可执行下面的语句,会有5条记录,而不是3条,最后再go为3条.这是什么原因,会导致那个触发器执行两次
    update a
    set code = 'aa'
    where i = 1select * from a
      

  4.   

    不加go,能执行通过吗?服务器: 消息 111,级别 15,状态 1,行 5
    'CREATE TRIGGER' 必须是批查询中的第一条语句。
    服务器: 消息 111,级别 15,状态 1,行 13
    'CREATE PROCEDURE' 必须是批查询中的第一条语句。
      

  5.   

    --如果只在'CREATE TRIGGER' 和 'CREATE PROCEDURE' 前加go,执行结果(后面的所有语句都是存储过程的内容,那里会触发触发器? 那里会调用存储过程?):无法在 sysdepends 中添加当前存储过程所对应的行,因为缺少该存储过程所依赖的对象 'p_1'。仍将创建该存储过程。