2017-06-19 9 views
0

は、例えば午前12時00分(上記のコードは、ストアドプロシージャ内にあり、スケジューラ毎日で実行されます SQLサーバーカーソルの実行二回

declare @index int; 
declare cursor1 cursor for 
select table1_index from table where (table1_date < dateadd(dd, -365, getdate())) 

open cursor1 
fetch next from cursor1 into @index 
while @@fetch_status = 0 
begin 
    update table1 
    set table1_field = SOMETHING 
    where table1_index = @index 

    if @ERROR = 0 
    insert into audit_trail 
    values(getdate(), table1_index) 

    fetch next from cursor1 into @index 
end 
close cursor1 
deallocate cursor1 

、私はデータを更新するために見つけるカーソルを持って日々を仮定)。

私の質問は、スケジューラがストアドプロを実行した場合です。 (たとえば、17/06/2017 12:00 AM)、実行中(たとえば、17/06/2017 05:00 PM)に実行されます。

(たとえば17/06/2017 03:00 PM)に同じコードを実行すると、カーソルは更新されたテーブルからデータを選択しますか?または、スケジューラによって更新されなかったテーブルのデータ?

ありがとうございます。

+0

トランザクションモードに依存しますが、ACID準拠モードとプロシージャ外のトランザクション境界を前提としています。最初のプロシージャの実行を開始する前のデータを使用します。 –

+0

暗黙的なトランザクションが発生しているため、更新ステートメント全体がテーブルおよび17/06/2017 03:00 PMの更なる更新をブロックしており、UPDATEステートメントが完了するのを待機している可能性があります。これは膨大なUPDATE文であるため、テーブルロックまたはページロックになってしまい、完了するまで他のトランザクションをブロックします。 –

+0

私の更新ステートメントは膨大ではないようで、実行に時間がかかりません。とにかく、あなたの答えに感謝:)。 – ProgrammingBaKa

答えて

1
declare cursor1 cursor for 
select table1_index from table where (table1_date < dateadd(dd, -365, getdate())) 
and table1_index NOT IN (SELECT table1_index FROM audit_trail) 

追加条件and table1_index NOT IN (SELECT table1_index FROM audit_trail)が必要です。それがあなたのために働くことを願っています。