sql sunucusunda ilk 100 kaydı nasıl güncelleyebilirim


393

SQL Server'daki ilk 100 kaydı güncellemek istiyorum. Ben bir masa T1alanları ile F1ve F2. T1200 kaydı vardır. F1İlk 100 kayıttaki alanı güncellemek istiyorum . TOP 100SQL Server'da nasıl güncelleyebilirim ?

Yanıtlar:


684

UPDATE ifadeleri için parantezler gereklidir:

update top (100) table1 set field1 = 1

28
Nasıl kullanılacağı hakkında bir fikrin var order bymı?
Joe Phillips

8
@JoePhilllips Sipariş için Martin Smith yanıtını kullanın
jjxtra

Ancak bunlar ilk 100 kayıt değil, sadece 100 keyfi olarak seçilen kayıttır. İlk 100, kayıtları sıralamak için bazı emirler içerecektir.
Thorsten Kettner

1
Bu, "istendiği gibi" sorusunu cevaplar, ancak TOP, bazı SİPARİŞ olmadan anlamsızdır (ve öngörülemez). Martin Smith tarafından verilen cevaba bakınız.
Andy G

1
btw: parantez önemlidir!
Simon_Weaver

300

ORDER BYBü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 TOPKabul edilen cevap sözdizimi bir desteklemediği ORDER BYmaddesini 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'

71
Anlamsız diyorsun ama bu doğru değil. İtiraf ediyorum ki, / genellikle /, TOPolası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.
MetaFight

17
@MetaFight Ancak, daha 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ı
Martin Smith

10
Asenkron bir işlem çalıştırabilmeniz için üst sipariş vermeden kullanmalıyım. Where cümlesi, zaten işlenmiş olanları içermeyecektir, ancak bir seferde sadece çok fazla işleyebilirim. Dolayısıyla son derece geçerli bir kullanım durumu vardır.
Jeff Davis

4
@Martin Smith: Diyelim ki toplu olarak güncellemek istiyorsunuz, bir seferde 10000 deyin. Bunun için iyi bir kullanım gibi görünüyor ve düzen önemli değil. Bu nasıl bir anlam ifade etmiyor?
Jay Sullivan

5
@notfed Bu, yukarıdaki yorumlarda zaten tartışılmış olanla aynı durumdur. Bu durumda Sorgunuzda olur değil kabul cevap it would bir gibi görünüyor? whereAynı satırları tekrar tekrar işlemekten kaçınmak için bir maddeye ihtiyacınız olacaktır .
Martin Smith

14

benim gibi olanlar için hala SQL Server 2000 ile sıkışmış SET ROWCOUNT {number};, UPDATEsorgu ö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


1
SET ROWCOUNT, güncellenen komutun yanı sıra tetikleyicileri de etkiler. Basamaklı silme ayarınız varsa, alt tabloda alt satırdan fazla satır sayısı varsa işlem başarısız olabilir.
EricI

Bununla birlikte, SET ROWCOUNT @RowCountParameter; geçerli sözdizimidir, SELECT TOP @RowCountParamter * FROM TableName geçersiz. Güncellenen satırları yapılandırmanız gerekirse, basamaklı silme etkinleştirilmiş alt tablolarınız yoksa, ROWCOUNT # AYARLA şu anda daha iyi seçenektir.
EricI


13
update tb set  f1=1 where id in (select top 100 id from tb where f1=0)

4

Daha da serin olanı, TOPgü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 UPDATEifadenin sözdizimini basitleştirmek yatıyor .


0

Deneyin:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)

0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.