0

次のコードで。一度に実行されるのは、'Select' ステートメントの 1 つだけです。選択した行の「ステータス」を更新し、データを返すことができるようにしたいと考えています。これにより、基本的に、バックエンド処理中に同じレコードがフェッチされるのを防ぎます。

ありがとう!

-- Insert statements for procedure here
if(@BatchSize > -1 and @Priority > -1)
begin
    Select TOP(@BatchSize) *,ID 
    From CompingQueue 
    Where PriorityLevel=@Priority 
       and Status=35 
    order by PriorityLevel asc;
end
if(@BatchSize = -1 and @Priority = -1)
begin
    Select * From CompingQueue 
    Where Status=35 
    order by PriorityLevel asc;
end

if(@BatchSize = -1 and @Priority > -1)
begin
   Select * From CompingQueue 
   WHEre PriorityLevel=@Priority 
     and Status=35     
   order by PriorityLevel asc;
end
if(@BatchSize > -1 and @Priority = -1)
begin
    Select TOP(@BatchSize) * 
    From CompingQueue 
    Where Status=35 
    order by PriorityLevel asc;
end
--update CompingQueue set Status = 2 where ID=
-- Set the Status Flag for each job

終わり

4

5 に答える 5

1

DECLARE @tblResults TABLE (...) を使用します。SELECT された行をテーブル変数に挿入します。この結合を UPDATE ステートメントの句として使用して、ソース テーブルから PK のテーブル変数への結合を実行し、変数を query/proc/func の結果として返します。

于 2013-03-22T19:26:02.357 に答える
1

1 つのオプションはUPDATE、テーブルのみを使用OUTPUTして、更新された行をテーブル変数に格納することです。SELECTその後、テーブル変数のデータをさらに処理することができます。

ドキュメントに例があります。

于 2013-03-22T19:29:51.797 に答える
0

SQL CTE は、あなたのケースに役立ちます。複数のプロセスが同じレコードを更新する可能性があるため、同時実行の問題を回避しようとしています。そして、あなたのクエリにはトップバッチがあるので、直接更新...出力は最良の選択ではないかもしれません. CTE + xlock、rowlock の方が適しています


;with Update_batch 
as 
(
  select top 10 * from compingqueue With (xlock, rowlock)
  order by PriorityLevel desc
)
update Update_batch
set ....=....
(xlock, rowlock) を使用して、CTE をオンフライ ビューとして扱うことができます。行が選択されると、(xlock, rowlock)が行に配置されます。これにより、他のプロセスが同じ行を取得することさえできなくなります。

于 2013-03-22T21:05:57.880 に答える
0

あなたはOUTPUT条項が欲しい。

http://msdn.microsoft.com/en-us/library/ms177564.aspx

次のようなものが欲しいようです

UPDATE c
SET somestuff = something
OUTPUT DELETED.*
FROM CompingQueue c
WHERE someotherstuff

または、更新後のデータが必要な場合は、INSERTED.*代わりに を使用しDELETED.*ます。

于 2013-03-22T19:36:16.213 に答える
0

次のように一度にすべてを行うのはどうですか。

Declare @NumRecs int
if @BatchSize > -1 Set @NumRecs = @BatchSize 
else Select @NumRecs = Count(*) From CompingQueue 
-- --------------------------
Declare @Ids table (id int primary key not null)
Insert @Ids(id)
Select top(@numRecs) id 
From CompingQueue 
Where Status=35 
   And PriorityLevel = Case 
      When @Priority > -1 Then @Priority 
      Else PriorityLevel End
Order by PriorityLevel asc;

 Select * From CompingQueue 
 Where Id In (Select id from @Ids);

 Update CompingQueue Set
    status = 2
 Where Id In (Select id from @Ids);
于 2013-03-22T19:41:28.723 に答える