各位高人们:
麻烦帮我看下我这个触发器呢,为什么老是提示 
 对象名 'inserted' 无效 
呢?百思不得其解.我要完成的功能是截获表中的字段名,以及修改后的新值,然后写入外部文件中.CREATE TRIGGER test ON dbo.student 
AFTER INSERT 
AS Begin 
declare cur cursor for select name from syscolumns where id = (select id from sysobjects where name ='student')
declare @buffer varchar(1000)
declare @tmp sysname 
declare @sql nvarchar(1000)
declare @data nvarchar(1000)
select @buffer = '###'
open cur
fetch next from cur into @tmp
while @@fetch_status=0
begin
select @sql = N'select @a='+@tmp+' from inserted';
exec sp_executesql @sql , N'@a sysname output',@data output;
print @sql
print @data
select @buffer = @buffer + convert(varchar , @tmp) +'###' +@data +'###'
fetch next from cur into @tmp
end
close cur
deallocate cur
exec SetFileName 'd:\mybuffer.txt';
exec WriteBuffer @bufferend; 

解决方案 »

  1.   

    inserted 不能存在于你的那个动态SQL中
      

  2.   

    CREATE   TRIGGER   test   ON   dbo.student   
    AFTER   INSERT   
    AS   Begin   
    select * into tmp from inserted
    declare   cur   cursor   for   select   name   from   syscolumns   where   id   =   (select   id   from   sysobjects   where   name   ='student') 
    declare   @buffer   varchar(1000) 
    declare   @tmp   sysname   
    declare   @sql   nvarchar(1000) 
    declare   @data   nvarchar(1000) 
    select   @buffer   =   '###' 
    open   cur 
    fetch   next   from   cur   into   @tmp 
    while   @@fetch_status=0 
    begin 
    select   @sql   =   N'select   @a='+@tmp+'   from   tmp ; 
    exec   sp_executesql   @sql   ,   N'@a   sysname   output',@data   output; 
    print   @sql 
    print   @data 
    select   @buffer   =   @buffer   +   convert(varchar   ,   @tmp)   +'###'   +@data   +'###' 
    fetch   next   from   cur   into   @tmp 
    end 
    close   cur 
    deallocate   cur 
    exec   SetFileName   'd:\mybuffer.txt'; 
    exec   WriteBuffer   @buffer 
    drop table tmp
    end;   
      

  3.   

    如 happyflystone 说,写在动态SQL里是不能使用的。另外触发器里写磁盘文件确实有点那个。能不用就不要用了。