我正在尝试用recordStatus=0
选择前1条记录,同时在存储过程中将recordStatus列更新为1,我的问题是可以在一个select语句中完成吗?或者我有使用3个语句?,这是我得到的:
PROCEDURE sp_getRecord
@recordID varchar(30) = NULL
AS
BEGIN
SELECT TOP (1) @recordID = recordID
FROM TABLEA
WHERE recordStatus = 0
UPDATE TABLEA
SET recordStatus = 1
WHERE recordID = @recordID
SELECT *
FROM TABLEA
WHERE recordID = @recordID
END
我尝试过研究,触发并没有运气,希望有人可以提供帮助。我对SQL不是很精通。
谢谢。
答案 0 :(得分:4)
是的,它可以而且应该在一个声明中完成。
您目前正在查找同一行三次。除了效率低下,这也会导致并发问题。
假设您是using the table as a queue,目前的代码中没有任何内容可以阻止两个并发事务同时运行SELECT
并接收相同的@recordID
。
您当前的代码没有ORDER BY
。这意味着它将是任意的,将被更新。如果您根本不关心(堆队列),那么您可以使用。
UPDATE TOP(1) TABLEA
SET recordStatus = 1
OUTPUT inserted.*
WHERE recordStatus = 0
如果你这样做,实际上需要ORDER BY
,那么你可以使用CTE
WITH T AS
(
SELECT TOP (1) recordID
FROM TABLEA
WHERE recordStatus = 0
ORDER BY recordID
)
UPDATE T
SET recordStatus = 1
OUTPUT INSERTED.*
答案 1 :(得分:0)
update top (1) TABLEA set recordStatus = 1 where recordStatus = 0