表结构如下
CREATE TABLE test1 (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[code] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[name] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[createtime] [datetime] not NULL default(getdate()) ,
[modifytime] [datetime] NULL 
) ON [PRIMARY]
GO
触发器如下
create trigger trg_test on test1
for insert
as
begin
declare @code varchar(50),@name varchar(50) select @code=code,@name=name from inserted

insert into test1(code,name,modifytime)
values(@code,@name,getdate())
end
go
执行
INSERT INTO test1 (code,name) VALUES ('0001','张三')
结果
1 0001 张三 2006-12-13 14:34:47.483 NULL
2 0001 张三 2006-12-13 14:34:47.500 2006-12-13 14:34:47.500
执行一次为什么会插入两条记录,而且第一条没有时间

解决方案 »

  1.   

    因为,你插入的数据 modifytime 没有默认值,而触发器 只是插入了一条新的值而已
      

  2.   

    第一条为语句本身插入的数据,里面没有指定modifytime的值,所以为NULL
    第二条为触发器产生的数据,里面指定了getdate(),所以有值!·
      

  3.   

    肯定是两条阿
    你自己用语句插入一条,那条数据是没有时间的然后触发器触发,又插入一条
    这个条数据的MODIFYTIME是有时间的!
      

  4.   

    为什么用这个它就插入一条啊
    create trigger trg_test on test1
    instead of insert
    as
    begin
        insert into test1(code,name,modifytime) 
        select code,name,getdate() from inserted
    end
    go
      

  5.   

    楼主是不是想给modifytime也赋一个初值同createtime一样,然后当修改当前数据时就把修改时的时间更新到modifytime中
    这只要在更新语句中来完成:
    update test1
    set modifytime=getdate(),name='aaa'
    where code=1
      

  6.   

    create trigger trg_test on test1
    INSTEAD OF insert
    as
    begin
    declare @code varchar(50),@name varchar(50) select @code=code,@name=name from inserted

    insert into test1(code,name,modifytime)
    values(@code,@name,getdate())
    end
    go
    楼主是这个意思吗?
      

  7.   

    instead of 
    指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。楼主想实现什么效果?
      

  8.   

    CREATE TABLE test1 (
    [id] [int] IDENTITY (1, 1) NOT NULL ,
    [code] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [name] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [createtime] [datetime] not NULL default(getdate()) ,
    [modifytime] [datetime] NULL   -----------------------------没有默认值,所以为空
    ) ON [PRIMARY]
    GO第二条是触发器增加的。
      

  9.   

    效果就是插入记录的时候用触发器自动把时间加上
    可不可以这样理解
    INSTEAD OF 和for insert 的区别就是触发触发器的时候还执行不执行原来的sql语句啊
      

  10.   

    正确!
    根据楼主的需求,就应该用instead of触发器
      

  11.   

    我现在正在学触发器
    如果我一定要用for insert 触发器该怎么做
      

  12.   

    create trigger trg_test on test1
    for insert
    as
    begin

    insert into test1
              select code,name,getdate() from inserted
    end
    go
      

  13.   

    发错了
    create trigger trg_test on test1
    instead of insert
    as
    begin

    insert into test1
              select code,name,getdate() from inserted
    end
    go