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