Jawaban:
Catatan, tanda kurung diperlukan untuk pernyataan UPDATE:
update top (100) table1 set field1 = 1
Tanpa ORDER BY
seluruh ide TOP
tidak masuk akal. Anda harus memiliki definisi yang konsisten tentang arah mana yang "naik" dan yang "turun" agar konsep top menjadi bermakna.
Meskipun demikian SQL Server memperbolehkannya tetapi tidak menjamin hasil yang deterministik .
The UPDATE TOP
sintaks dalam jawaban yang diterima tidak mendukung ORDER BY
klausa namun ada kemungkinan untuk mendapatkan semantik deterministik sini dengan menggunakan CTE atau meja diturunkan untuk menentukan urutan yang diinginkan seperti di bawah ini.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
peluang, Anda harus menggunakannya dengan ORDER BY
apa yang Anda minati adalah seperti "paling" atau "paling tidak" dari sesuatu. Namun, dalam kasus lain, Anda mungkin hanya tertarik untuk mendapatkan satu catatan yang cocok. Sukai saya hari ini! Saya perlu memperbaiki masalah data (siklus) satu per satu. Seluruh proses perbaikan melibatkan skrip db, beberapa intervensi pengguna, dan beberapa operasi aplikasi. Kami tidak peduli catatan WHICH yang ditangani terlebih dahulu. Kami hanya peduli bahwa kami menangani mereka satu per satu.
WHERE
klausa untuk mengecualikan catatan yang sebelumnya diproses. Pertanyaan sebagai jawaban tertulis dan diterima sangat tidak berarti. BTW: Untuk menggunakan tabel sebagai antrian, ini adalah tautan yang cukup berguna
where
klausa untuk menghindari pemrosesan baris yang sama berulang kali.
bagi yang seperti saya masih terjebak dengan SQL Server 2000, SET ROWCOUNT {number};
dapat digunakan sebelum UPDATE
permintaan
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
akan membatasi pembaruan hingga 100 baris
Sudah ditinggalkan setidaknya sejak SQL 2005, tetapi pada SQL 2017 masih berfungsi. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Yang lebih keren adalah kenyataan bahwa Anda dapat menggunakan Fungsi Table-Valued inline untuk memilih TOP
baris ( dan berapa banyak ) yang akan diperbarui. Itu adalah:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Untuk fungsi bernilai tabel, Anda memiliki sesuatu yang menarik untuk memilih baris yang akan diperbarui seperti:
CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
@Param1 INT,
@Param2 INT,
@Param3 INT
)
RETURNS TABLE AS RETURN
(
SELECT TOP(1) MyTable.*
FROM MyTable
JOIN MyOtherTable
ON ...
JOIN WhoKnowsWhatElse
ON ...
WHERE MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
..., dan ada kebohongan (menurut pendapat saya yang sederhana) kekuatan sebenarnya dari memperbarui hanya baris yang dipilih paling deterministik sementara pada saat yang sama menyederhanakan sintaks UPDATE
pernyataan.
Mencoba:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Anda juga dapat memperbarui dari pilih menggunakan alias dan bergabung:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order by
?