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)に同じコードを実行すると、カーソルは更新されたテーブルからデータを選択しますか?または、スケジューラによって更新されなかったテーブルのデータ?
ありがとうございます。
トランザクションモードに依存しますが、ACID準拠モードとプロシージャ外のトランザクション境界を前提としています。最初のプロシージャの実行を開始する前のデータを使用します。 –
暗黙的なトランザクションが発生しているため、更新ステートメント全体がテーブルおよび17/06/2017 03:00 PMの更なる更新をブロックしており、UPDATEステートメントが完了するのを待機している可能性があります。これは膨大なUPDATE文であるため、テーブルロックまたはページロックになってしまい、完了するまで他のトランザクションをブロックします。 –
私の更新ステートメントは膨大ではないようで、実行に時間がかかりません。とにかく、あなたの答えに感謝:)。 – ProgrammingBaKa