Saya memiliki prosedur tersimpan yang terlihat seperti ini:

alter procedure newProcedure
    @take int,
    @skip int
as
begin
    set nocount on

    declare @countRowNumbers int;
    set @countRowNumbers = (select count(*) from TableA)

    select * 
    from tableA a
    order by a.ID
        offset ISNULL(@skip,0) rows
        fetch next ISNULL(@take, @countRowNumbers) rows only

    --update only fetched rows (first 100, or second 100)
    -- update TableA set Status = 2
end

Saya memiliki status kolom yang menunjukkan apakah baris sedang diproses atau tidak, jadi ketika saya mengambil 100 dokumen itu, saya perlu memperbarui status Status itu menjadi 2.

Bagaimana saya bisa melakukannya?

0
Stefan0309 23 Desember 2020, 20:39

3 jawaban

Jawaban Terbaik

Menggabungkan jawaban lain, menggunakan CTE yang dapat diperbarui untuk menjalankan update terlebih dahulu, kemudian menggunakan output klausa untuk menangkap ID yang diperbarui dan kemudian select untuk mengembalikannya.

declare @SelectedId table (id int);

with toupdate as (
      select * 
      from tableA a
      order by a.ID
      offset isnull(@skip,0) rows
      fetch next isnull(@take, @countRowNumbers) rows only
)
update toupdate
    set [status] = 2
output Inserted.id into @SelectedId;

select *
from tableA
where ID in (select id from @SelectedId)
order by ID;
2
Dale K 23 Desember 2020, 23:13
alter procedure newProcedure
    @take int,
    @skip int
as
begin
    set nocount on

    declare @countRowNumbers int;
    set @countRowNumbers = (select count(*) from TableA)
    
    update tableA set status = 2 where ID in (
    select a.ID
    from tableA a
    order by a.ID
        offset ISNULL(@skip,0) rows
        fetch next ISNULL(@take, @countRowNumbers) rows only )

    --update only fetched rows (first 100, or second 100)
    -- update TableA set Status = 2
end
0
Dale K 23 Desember 2020, 20:49

Anda harus dapat menggunakan CTE yang dapat diperbarui untuk ini:

with toupdate as (
      select * 
      from tableA a
      order by a.ID
      offset ISNULL(@skip,0) rows
      fetch next ISNULL(@take, @countRowNumbers) rows only
     )
update toupdate
    set status = 2;
0
Gordon Linoff 23 Desember 2020, 18:22