Yanıtlar:
UPDATE ifadeleri için parantezler gereklidir:
update top (100) table1 set field1 = 1
ORDER BY
Bütün bir fikir olmadan TOP
çok mantıklı değil. Üst kavramın anlamlı olması için hangi yönün "yukarı" ve hangisinin "aşağı" olduğu konusunda tutarlı bir tanımınızın olması gerekir.
Yine de SQL Server buna izin verir, ancak deterministik bir sonucu garanti etmez .
UPDATE TOP
Kabul edilen cevap sözdizimi bir desteklemediği ORDER BY
maddesini ancak aşağıda istenen sıralama düzeni tanımlamak için bir CTE veya türetilmiş tablo kullanarak burada deterministik semantiğini almak mümkündür.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
olasılıkları kullanırken bunu kullanmalısınız, ORDER BY
çünkü ilgilendiğiniz şey bir şeyin "en" veya "en az" gibidir. Ancak diğer durumlarda, yalnızca bir eşleşen kayıt almak isteyebilirsiniz. Bugün benim gibi! Veri sorunlarını (döngüleri) birer birer düzeltmem gerekiyordu. Tüm düzeltme işlemi bir db betiği, bazı kullanıcı müdahaleleri ve bazı uygulama işlemlerini içeriyordu. HANGİ kaydın ilk ele alındığı umurumda değildi. Onları teker teker ele aldığımızı umursadık.
WHERE
önce işlenmiş kayıtları hariç tutmak için bir cümle olurdu . Yazılı ve kabul edilmiş cevap olarak soru oldukça anlamsızdır. BTW: Tabloları kuyruk olarak kullanmak için bu oldukça faydalı bir bağlantı
where
Aynı satırları tekrar tekrar işlemekten kaçınmak için bir maddeye ihtiyacınız olacaktır .
benim gibi olanlar için hala SQL Server 2000 ile sıkışmış SET ROWCOUNT {number};
, UPDATE
sorgu önce kullanılabilir
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
güncellemeyi 100 satıra sınırlayacak
En azından SQL 2005'ten beri kullanımdan kaldırıldı, ancak SQL 2017'den itibaren hala çalışıyor. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Daha da serin olanı, TOP
güncellenecek satır (lar) ı seçmek için satır içi Tablo Değerli İşlevini kullanabilmenizdir . Yani:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Tablo değerli fonksiyon için, güncellenecek satırı seçmek için ilginç bir şey var:
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
)
... ve (benim düşünceme göre) sadece üst seçili satırları belirleyici olarak güncellemenin gerçek gücü ya da UPDATE
ifadenin sözdizimini basitleştirmek yatıyor .
Deneyin:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Ayrıca takma ad kullanarak seçimden güncelleyebilir ve katılabilirsiniz:
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
mı?