我们先来复习下这两个表:

 Inserted和Deleted这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此,不允许用户直接对其 修改。
这两个表的结构与被该触发器作用的表在相同的表结构。这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除。

 

 

 

 

 

  接下来,看看我们的事例,其实使用起来很简单,但也很实用。他除了用上面的两张表外,还使用了output参数。

 创建表:

代码
IF    EXISTS  ( SELECT   *   FROM  sys.objects  WHERE   object_id   =   OBJECT_ID (N ' [TestTB] ' AND  type  in  (N ' U ' ))
DROP   TABLE  TestTB
CREATE   TABLE  TestTB(
    
[ id ]   [ int ]   IDENTITY ( 1 , 1 PRIMARY   KEY   NOT   NULL ,
    Province 
[ varchar ] ( 50 NULL ,
    City 
[ varchar ] ( 50 NULL
)

 

1、插入数据,并返回插入的数据:

INSERT   INTO  TestTB(Province,City)
output inserted.Province,
 inserted.City
VALUES ( ' 广东 ' , ' 深圳 ' )

 

返回的结果:

 2、同理,删除数据也是一样的,只不过是使用deleted表罢了。

delete   from  TestTB
output deleted.
*
where  id = 1

 

返回结果:

3、两个结合一起:返回更新前和更新后的数据:

UPDATE  TestTB  SET  Province  =   ' 湖南 ' ,City = ' 郴州 '
OUTPUT 
' 我来自(更新前) ' +  DELETED.Province + DELETED.City  as   [ Before ]  , ' 我来自(更新后) '   +  Inserted.Province + Inserted.City  as   [ After ]
WHERE  id = 1

 

返回结果:

4、还可以将返回的结果保存在表变量中,这在删除数据,并把删除的数据插入到历史表时很实用

DECLARE   @tempTable   TABLE (
    id 
int ,
    Province 
varchar ( 50 ),
    City 
varchar ( 50

DELETE   FROM  TestTB OUTPUT deleted. *   INTO   @tempTable
WHERE  id  >   4
 
SELECT    *   FROM   @tempTable
posted on 2010-02-04 16:33  宋元  阅读(611)  评论(0编辑  收藏  举报