Tüm satırları döndürecek bir SELECT TOP içinde kullanabileceğim bir değer var mı?


13

Son kullanıcının bir sorgu (SELECT TOP (@x)) tarafından döndürülen kaç satırı tanımlamasına izin veriyorum. Tüm satırların döndürüldüğü yere girilebilecek bir değer var mı? Yoksa tüm satırların döndürülmesini istiyorlarsa TOP (@x) olmadan sorguyu dinamik olarak mı oluşturmak zorundayım?

SQL Server 2012 kullanıyorum.


Bir TOP ... ORDER BYşey mi? ORDER BYHepsini seçmeniz durumunda hala gerekli olan bir şey var mı ?
Martin Smith

1
Sanýrým uhhh ... sadece konuţmayý ihmal TOPmi ediyorsun? Bazı önceden tanımlanmış bir sorgu ile uğraşıyor ve bir şey geçirmek zorunda gibi ?
corsiKa

Yanıtlar:


17

YÜZDE kullanmıyorsanız TOP bir BÜYÜK gibi görünüyor . Bu, BIGINT'in maksimum değerini geçebileceğiniz anlamına gelir ,

SELECT TOP (9223372036854775807) * FROM table1

Büyük bir masa göreceğinizden şüpheliyim. Sorgu planı üzerinde ne tür bir etkisi olurdu emin değilim.


7
Değişkenin @xbir BIGINT olduğunu varsayarsak, SET @x = 0x7fffffffffffffffbazıları için daha net olabilir. Yine de hatırlamak daha kolay.
Martin Smith

@MartinSmith Dürüst olacağım, her iki şekilde de arayacağım :) Daha önce yapıldığını hiç görmedim. Bu örtük bir dönüşüm mü?
Kenneth Fisher

7
Sadece başlamayı hatırlıyorsanız 7ve geri kalanını hatırlarsanız Fve 8 bayt için toplamda 16 karaktere ihtiyacınız varsa hatırlamak daha kolaydır . Ve evet, o veri tipinin bir değişkenine atanırsa dolaylı olarak dönüştürülecektir.
Martin Smith

@MartinSmith Değerin ikili sunumuna güvenmek iyi bir uygulama mı? Dokümantasyon bildiren bir değerin ikili gösterimi, SQL Server sürüm sürüm değişebilir . Ayrıca, her zaman SqlServer içinde 0x7fffffffffffffffmaksimum değerinin temsiliyle karıştırılan tek kişi olup olmadığımı bilmiyorum bigint. Bunun nedeni, SqlServer ikili sabit gösterimlerinde 7fen düşük baytta, c ++ gibi dillerde olduğu gibi, en yüksek baytta işaretli integral türünü elde etmenizdir.
i-one

3
ORi-on. Tamsayı tiplerinin ikili gösteriminin değişmesi pek olası değildir. SQL Server'da, belirli bir formata güvenebileceğimiz beklenmiyorsa, tamsayı türlerinde çalışan bitsel işleçler sağlayan hiçbir nokta olmazdı.
Martin Smith

12

Ayrıca düşünebilirsiniz

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Onun yerine

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

@X olarak ayarlamanız gereken değer 0, devre dışı bırakmaktır.

Bu, veri değiştirme ifadeleri için kullanımdan kaldırılmıştır, ancak kullanımdan kaldırılmamıştır SELECT.

2012 yılında ROWCOUNT, sıfır olmayan bir değere karşı 0 olan durum için farklı bir plan derlenmiştir .

Eğer ORDER BY Bazanlam vermek sadece orada TOPsonuçlar için bir sunum sırası sağlamak yerine ve bir indeks de gereksiz bir tür önleyeceğini iki sorguları içine bu daha sonra ayrılma desteklenecek yok 0durumda.


8

TOP 100 YÜZEYİ SEÇ, sorguda "TOP" kullanarak herhangi bir hatayı atlamak için kullanılabilir.


1
Bana göre bu, optimize edilen bir özelliği kullanma nedenini açıklamıyor. Mu Crystal Reports bekliyoruz görünüm tanımında orada olmak için bir ORDER BY?
Andriy M

Hayır, Crystal Reports'un sorguları tutmak ve kendi yürütme planlarını zorlamakla ilgili sorunları vardır, bu da onları çok verimsiz ve bazen yanlış yapar. TÜM mantık ve tasarım SQL sorgusu yapmak ve sadece Crystal "güzel" yapmak tercih ederim. Bu yüzden çoğunlukla SSIS / SSRS'ye geçtim, ancak hala eski raporlar var.
MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
Soru TOP maddesini parametrelemekle ilgilidir . OP'de zaten bir parametre ( @x) vardır ve şimdi @xtablonun gerçekte kaç satırı olduğuna bakılmaksızın "tüm satırlar" anlamına gelmesi için hangi değerin geçileceğini soruyorlar . Belki de çözümünüzü OP'nin gereksinimlerine uyacak şekilde nasıl uyarlayacağınızı öğrenebilirsiniz.
Andriy M

1
Soruya uyacak ayarlamaları yaptım ama yazılı olarak aynı anda satırlar eklenirse bu bir yarış durumu var. Bu, eşzamanlı kesici uçları engelleyen çözümleme süresi boyunca bir tablo kilidi gerektirir. Bu ve ilk etapta fazladan kontrol masrafı sadece çok sayıda kullanılarak önlenebilir.
Martin Smith

(SELECT COUNT(*) FROM YourTable)bir değer değil.
ypercubeᵀᴹ
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.