Delete语句和Output子句

2014-11-24 08:26:05 · 作者: · 浏览: 3
Delete语句和Output子句
[sql] 
                                
--1.当delete语句要关联其他表时与update语句类似,可参考上面update语句的写法  
  
--2.truncate table语句删除行比delete快很多,不过必须一次删除所有的行(没有where子句)  
--之所以快是因为记录的日志很少,采用表级别锁。  
--如果表中有IDENTITY列,会被重置为列定义的种子值4、TOP--1.在一个事务中删除所有记录,此表的记录有1000w条  
delete from distribution  
  
--2.通过top每次只删除1000条记录  
while (select COUNT(*) from distribution) > 0  
begin  
    delete top (1000)  
    from distribution  
end  
  
/*===============================================================  

比较1和2(不只限于delete,还包括update、insert),2有以下优点:
1.每次操作1000条,就提交一次,那么产生少量的日志,使日志空间更容易被重用;
如果一次删除大量记录,而产生的大量日志可能比整个日志文件还大,
那么会引起日志文件的自动增长,会影响性能
2.分块操作记录,一次锁住更少的记录,占用更少的锁资源,
锁定时间更短,操作完成后这些记录可被其他进程访问,并发性更好
=================================================================*/
OUTPUT子句
[sql] 
create table t(vid int not null,pic varchar(10) not null)  
  
insert into t  
values(1,'abc'),  
      (2,'def'),  
      (3,'hjkl')  
  
--output必须写在where子句之前  
update t  
set pic = 'xyz'       --更新操作由删除+添加组合的  
output deleted.vid,   --删除的记录  
       deleted.pic,  
         
       inserted.vid,  --添加的记录  
       inserted.pic  
where vid < 100  
  
--output写在values之前  
insert into t(vid,pic)  
output inserted.*  
values(5,'mn')  
  
  
declare @temp table(vid int,pic varchar(10))  
  
delete from t  
output deleted.vid,            --引用所有字段deleted.*  
       deleted.pic into @temp  
where vid < 100