2

我正在尝试选择前 1 条记录,recordStatus=0同时在存储过程中将 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不是很精通。

谢谢你。

4

2 回答 2

4

是的,它可以而且应该在一个声明中完成。

您当前正在查找同一行 3 次。除了效率低下,这还可能导致并发问题。

假设您将表用作队列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.*
于 2013-11-05T18:37:05.003 回答
0
update top (1) TABLEA set recordStatus = 1 where recordStatus = 0
于 2013-11-05T18:57:52.080 回答