2013-10-25 22 views
17

Bir aşağıdaki sorgu var: Öncelikli sütun vardır Mesajlar tablodaSQL SİPARİŞ BY ile ÜSTÜN GÜNCELLEME?

UPDATE TOP (@MaxRecords) Messages 
SET status = 'P' 
OUTPUT inserted.* 
FROM Messages 
where Status = 'N' 
and InsertDate >= GETDATE() 

ve ben ilk yüksek öncelikli mesajları seleci istiyorum. Bu yüzden bir siparişe ihtiyacım var. Ancak, sıralı çıktıya sahip olmamam, güncelleme işlemlerinden önce verileri sıralamam gerekmiyor.

Bildiğim kadarıyla UPDER deyimine ORDER BY eklemek mümkün değil. Başka fikirlerin var mı?

m.

;with cte as (
    select top (@MaxRecords) 
     status 
    from Messages 
    where Status = 'N' and InsertDate >= getdate() 
    order by ... 
) 
update cte set 
    status = 'P' 
output inserted.* 

Bu seferki kullanır:

+1

[SQL güncelleştirme top1 satır sorgusu] 'nın olası kopyası (http://stackoverflow.com/questions/3860975/sql-update-top1-row-query) – fabriciorissetto

+0

Olası çoğaltılacak [Nasıl güncellenir ve ms sql kullanarak sipariş verilebilir ] (http://stackoverflow.com/questions/655010/how-to-update-and-order-by-using-ms-sql) – Athafoud

cevap

27

gibi alt sorgu deneyebilirsiniz olduğunu SQL Server'da güncellenebilir görünüm gibi cte güncellemek mümkün.

-6

güncelleştirmenin doğru sözdizimi

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
[WHERE where_condition] 
[ORDER BY ...] 
[LIMIT row_count] 
+0

Sql Sunucusunda değil. – mark

12

Sen bunun için ortak tablo ifade kullanabilirsiniz

UPDATE Messages 
    SET status = 'P' 
    WHERE MessageId IN (SELECT TOP (@MaxRecords) MessageId FROM Messages where Status = 'N' and InsertDate >= GETDATE() ORDER BY Priority) 
output inserted.* 
+0

Benim durumumda, tüm eşleşen kayıtları WHERE yan tümcesiyle güncelleştirmek istediğim için TOP kullanmıyordum ve şu hatayı aldım: "ORDER BY yan tümcesi görünümler, satır içi işlevler, türetilmiş tablolar, alt sorgular ve ortak tablo ifadeleri geçersiz TOP, OFFSET veya FOR XML için de belirtilmemişse. " Bir manken ÜST (100000) ekleyerek çalışmasını sağlayın. Benim durumumda daha iyi bir çözüm olup olmadığını bilmiyorum. –

+2

@AugustoBarreto '100 yüzde' yi kullanarak tüm kayıtları kayıtsız bir sayı yerine kullanabilirsiniz. – Athafoud

+0

Teşekkürler! Bunu bilmiyordum. Dokümanları okuma: "Bir sorgu sonucunda döndürülen satırları belirtilen sayıda satır veya satır yüzdesiyle sınırlar" –