thi*_*ag0 1 sql-server stored-procedures
我正在尝试编写一个 SQL Server 存储过程,该过程从表中选择顶行,更新该行中的列,然后返回包含更改的行。
例如:
row = SELECT TOP 1 FROM RequestsUPDATE Requests SET row.Locked = TrueRETURN row我似乎无法做到这一点......有人能指出我正确的方向吗?
update top(1) Request
set Locked = 1
output inserted.*
where Locked = 0
Run Code Online (Sandbox Code Playgroud)
当您需要 order by 来获取要修改的行时的版本。在这里您将设置Locked=1为最高DateField值,其中Locked = 0
测试数据
create table Request(ID int, Locked bit, DateField datetime)
insert into Request values (1, 0, '20010101')
insert into Request values (2, 0, '20010102')
insert into Request values (3, 0, '20010103')
Run Code Online (Sandbox Code Playgroud)
使用 cte 更新语句
;with cte as
(
select *,
row_number() over(order by DateField desc) as rn
from Request
where Locked = 0
)
update cte
set Locked = 1
output inserted.ID, inserted.Locked, inserted.DateField
where rn = 1
Run Code Online (Sandbox Code Playgroud)
结果
ID Locked DateField
----------- ------ -----------------------
3 1 2001-01-03 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
或者,如果您想使用inserted.*而不是在输出子句中指定字段,则可以这样做。
update Request
set Locked = 1
output inserted.*
from Request as r
inner join
(select ID, row_number() over(order by DateField desc) as rn
from Request
where Locked = 0) as rs
on r.ID = rs.ID and
rs.rn = 1
Run Code Online (Sandbox Code Playgroud)