如题:
我想创建一个触发器 当在A表中插入数据时把新数据再插入到B表
A表和B表的字段不同
间的触发器如下:
CREATE TRIGGER [Dth_Action_insert] on [dbo].[zydsj]
instead of insert
as
begin
set nocount on;
declare
@OnlyId varchar(23),
@IsSync tinyint,
@Opertime datetimeset @IsSync = (select czbh from inserted)
set @OnlyId = (select jccfs from inserted)
set @Opertime = (select rq from inserted)insert into Dth_Action
(OnlyId,IsSync,Opertime)
values
(@OnlyId,@IsSync,@Opertime)
end

解决方案 »

  1.   

    唉。给你搜索一下吧:http://www.google.com.hk/search?q=t-sql+trigger+inserted&hl=zh-CN&safe=strict&prmd=ivns&source=lnt&tbs=lr:lang_1zh-CN|lang_1zh-TW&lr=lang_zh-CN|lang_zh-TW&sa=X&ei=tlM9TZHYK8X0cLunxIUH&ved=0CAcQpwUoAQ比如你打开查询分析器,然后写一条语句,例如:insert into A(.....) select .... from T1 join T2 on ......,也就是说用一条语句向表A插入了一堆记录,触发器于是就应该从inserted表中将这些数据插入给B表。
      

  2.   

    注意,千万不要想当然地以为触发器是按照一条一条记录来触发的,它的inserted表中会有一堆记录,而不仅仅一条,所以一看到那种declare几个变量来保存记录的值的代码,十有八九都是想当然地以为只会有一条inserted记录需要处理的bug。
      

  3.   

    看看真正的那些触发器的例子,它会使用类似   insert into Dth_Action(OnlyId,IsSync,Opertime) select OnlyId,IsSync,Opertime from inserted甚至复杂一点,比如有些字段值并不在inserted中,往往要用inserted表跟其它表left join,来插入。但是无论如何,一眼就能看出,真正的触发器代码是不应该去向你那样declare几个变量的!
      

  4.   


    呵呵,我就给你写了一条。可以看看你的代码中括号中的代码,当inserted有多条记录时,它如何给变量IsSync 赋值呢?所以这个代码错在这个出发点上。
      

  5.   

    我给你搜的链接就算没有插入的例子,但是肯定每一个代码都说明了这个思想。比如我就看了一下列表中比较靠前的一篇“lu7kang的专栏- CSDN博客”,他就有这样的代码:delete order_test from order_test,inserted
      where order_test.orderid=inserted.orderid and
      inserted.customerid not in (select customerid from cust_test)这就说明了如何使用inserted了嘛。只不过它是delete,而你是要insert,但是这没有什么阻碍。基础要点对路了,路就自己能走出来了。
      

  6.   

    instead of insert
    替换了原来的动作,改为for insert
      

  7.   

    呵呵,说实在上,上面的博客中的这个代码我觉得不好。但是不是指lz的这个问题。而是,该用inner join的地方千万不要用地卡尔积,该用not existes的地方最好不要用not in。
      

  8.   


    我没有仔细看是否lz不应该替换,只是基于它的说法“当在A表中插入数据时把新数据再插入到B表,A表和B表的字段不同”,他大概是无所谓instea of还是after of操作的。
      

  9.   

    Create   table   TEST 
    (id           Int   Identity(1,1), 
    title       Varchar(20), 
    tmpid       Int 

    Create   table   TEST2
    (
    title       Varchar(20), 
    tmpid       Int 

    GO 
    --建立触发器 
    Create   Trigger   [TEST_Insert]   On   TEST 
    FOR   INSERT 
    As 
    Update   TEST   Set   tmpid=@@IDENTITY 
    insert into TEST2 select title,tmpid from  TEST where  tmpid=@@IDENTITY 
    GO 
    --测试  
    Insert   TEST   (title)   Values( 'AAAA ') 
    Insert   TEST   (title)   Values( 'BBBB ') 
    Select   *   from   TEST2 
    --删除测试环境 
    Drop   table   TEST2 
    Drop   table   TESTAAAA  1
    AAAA  2
    BBBB  2