2011-07-11 33 views
2

OUTPUTを持たないSQL Server 2000の次のSQL Server 2005/2008スクリプトを書き直す方法が不思議です。SQL Server 2000 - 行を更新して更新された行を返します

基本的には、デッドロックを作成せずに行を更新し、更新された行を返したいとします。

ありがとうございます!あなたは何ができるか

UPDATE TABLE 
SET Locked = 1 
OUTPUT INSERTED.* 
WHERE Locked = 0 

答えて

4

あなたはできない2000のSQL Serverできれいに

競合状態を防ぐために、トランザクションおよびいくつかのロックヒントを使用しています。主な問題は、デッドロックではなく、同じ行にアクセスする2つのプロセスです。詳しくはSQL Server Process Queue Race Conditionをご覧ください。

BEGIN TRANSACTION 

SELECT * FROM TABLE WITH (ROWLOCK, READPAST, UPDLOCK) WHERE Locked = 0 

UPDATE TABLE 
SET Locked = 1 
WHERE Locked = 0 

COMMIT TRANSACTION 

これは試していませんが、INSERTEDからUPDATEトリガーでSELECTを試すこともできます。

+0

これは機能します。ありがとうございました。私はまた参照のために元のスレッドからのリンクを追加しました。 http://www.mssqltips.com/tip.asp?tip=1257 – Win

関連する問題