2011-08-08 10 views
4

更新されたすべてのレコードを返すストアドプロシージャを作成しようとしています。更新されたレコードを返すSQL Serverストアドプロシージャ

私の更新クエリはこれです:私はちょうどそれらの特定のレコードを返すするかどうかはわかりません

UPDATE BatchItems 
SET [Status] = 'Processing' 
WHERE [Status] = 'Queued' 

+0

アップデートを実行する前に、レコードを選択することはできますか?実際には、更新される前に同じレコードが提供されます。私。 Statusを 'Queued'に設定したBatchItemsから*を選択し、更新を実行します。同じネット結果 – kd7

+0

selectとupdateの間にレコードが挿入されている可能性があるので、これをやりたくありません。 –

+0

可能であれば同時実行性の問題があるとは知らなかった – kd7

答えて

4

OUTPUT INSERTED.[cols]を使用して、ステートメントが変更した行をフェッチすることができます。

UPDATE BatchItems 
    SET [Status] = 'Processing' 
    OUTPUT INSERTED.* 
WHERE [Status] = 'Queued' 

例;

select 'Queued  ' as status, 1 as id into #BatchItems 
insert #BatchItems values ('Queued', 2) 
insert #BatchItems values ('XXX', 3) 

UPDATE #BatchItems 
    SET [Status] = 'Processing' 
    OUTPUT INSERTED.* 
WHERE [Status] = 'Queued' 

>>status  id 
>>Processing 2 
>>Processing 1 
+0

@marc_s INSERT/UPDATE/DELETEと完全に動作します。更新 –

4

SQL Server 2005以上を使用している場合は、OUTPUT句を使用できます。

http://msdn.microsoft.com/en-us/library/ms177564(v=SQL.90).aspx

update BatchItems 
set Status = 'Processing' 
output inserted.* 
where Status = 'Queued' 
+0

+1でバージョンの問題を初めて確認しました:-) – EBarr

+0

どのバージョンの問題? –

+0

出力句は、SQL 2k5以上でのみサポートされています。 –

関連する問題