2

recordStatus=0トップ 1 レコードを選択し、同時にストアド プロシージャで recordStatus 列を 1 に更新しようとしています。私が得た:

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

はい、1 つのステートメントで実行できますし、実行する必要があります。

現在、同じ行を 3 回検索しています。これは非効率であるだけでなく、並行性の問題を引き起こす可能性もあります。

テーブルをキューとして使用していると仮定すると、現在のコードには、実行中SELECTと受信中の両方の 2 つの同時トランザクションを停止するものは何もありません@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 に答える