所有人都知道select top 的用法但很多人还不知道update top 和 delete top 怎么用以往的做法是set rowcount来指定其实SQL中对于Top语句的增强除了参数化之外还包括对update和delete的支持但可惜的是还不支持自定义 的order by列如果要自定义派序列可以借助CTE对于CTE的任何更改都会影响到原始表
我们看下面的测试代码
复制代码 代码如下:
set nocount on
use tempdb
go
if (object_id (
tb
) is not null )
drop table tb
go
create table tb (id int identity (
)
name varchar (
)
tag int default
)
insert into tb (name ) select
a
insert into tb (name ) select
b
insert into tb (name ) select
c
insert into tb (name ) select
d
insert into tb (name ) select
e
/*
更新前两行
id name tag
a
b
c
d
e
*/
update top (
) tb set tag =
select * from tb
/*
更新后两行
id name tag
a
b
c
d
e
*/
;with t as
(
select top (
) * from tb order by id desc
)
update t set tag =
select * from tb
/*
删除前两行
id name tag
c
d
e
*/
delete top (
) from tb
select * from tb
/*
删除后两行
id name tag
c
*/
;with t as
(
select top (
) * from tb order by id desc
)
delete from t
select * from tb
set nocount off
我会在下一篇文章中介绍一个应用就是很多人关心的如何独占查询(就是一条数据只被一个终端select到)
如果你感兴趣的话可以自己先思考一下我给一个提示
SQLServer有一个关键字Output它可以将更改和插入的数据输出我们配合update top就可以模拟出来一个相对高效的独占查询的事物此功能适合用在并行的任务处理或者消费中