SQL Server存储过程选择前1并在一个语句中更新?

时间:2013-11-05 18:30:48

标签: sql sql-server tsql stored-procedures

我正在尝试用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不是很精通。

谢谢。

2 个答案:

答案 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