Apakah ada nilai yang bisa saya gunakan dalam SELECT TOP yang akan mengembalikan semua baris?

13

Saya mengizinkan pengguna akhir untuk menentukan berapa banyak baris yang dikembalikan oleh permintaan (SELECT TOP (@x)). Apakah ada nilai yang bisa dimasukkan di mana semua baris dikembalikan? Atau apakah saya harus secara dinamis membuat kueri tanpa TOP (@x) jika mereka ingin semua baris dikembalikan?

Saya menggunakan SQL Server 2012.

Wayne E. Pfeffer
sumber
Apakah itu TOP ... ORDER BY sesuatu? Apakah ORDER BYsesuatu masih diperlukan jika Anda memilih semua?
Martin Smith
1
Saya kira uhhh ... hanya menghilangkan TOPkeluar dari pertanyaan? Seperti Anda berurusan dengan beberapa permintaan yang telah ditentukan dan Anda harus memberikannya sesuatu ?
corsiKa

Jawaban:

17

Yah, sepertinya TOP adalah BIGINT jika Anda tidak menggunakan PERCENT . Itu berarti Anda bisa memberikan nilai maksimum BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Aku benar-benar ragu kau akan melihat meja sebesar itu. Saya tidak yakin apa efek yang akan terjadi pada rencana kueri.

Kenneth Fisher
sumber
7
Dengan asumsi variabel @xadalah BIGINT maka SET @x = 0x7fffffffffffffffmungkin lebih jelas bagi sebagian orang. Lebih mudah diingat.
Martin Smith
@ MartinSmith Saya akan jujur ​​saya akan mencarinya :) Saya belum pernah melihat itu dilakukan sebelumnya. Apakah itu konversi implisit?
Kenneth Fisher
7
Yah lebih mudah untuk diingat jika Anda hanya ingat untuk memulainya 7dan kemudian sisanya adalah Fdan Anda membutuhkan total 16 karakter untuk 8 byte. Dan ya itu akan dikonversi secara implisit jika menugaskan ke variabel tipe data itu.
Martin Smith
@ MartinSmith Apakah praktik yang baik untuk mengandalkan representasi biner dari nilai? The dokumentasi menyatakan Representasi biner dari nilai mungkin berubah dari versi ke versi SQL Server . Juga, saya tidak tahu apakah saya satu-satunya orang, yang selalu bingung dengan 0x7fffffffffffffffrepresentasi nilai maksimal bigintdi SqlServer. Alasannya adalah bahwa dalam notasi konstanta biner SqlServer yang Anda miliki 7fdalam byte terendah , sedangkan dalam bahasa seperti c ++ Anda memilikinya dalam byte tertinggi untuk mendapatkan maks dari tipe integral yang ditandatangani.
i-one
3
@ i-one. Representasi biner dari tipe integer sangat tidak mungkin berubah. Tidak akan ada gunanya dalam SQL Server memasok operator bitwise yang beroperasi pada tipe integer jika tidak diharapkan kita bisa mengandalkan format tertentu.
Martin Smith
12

Anda juga bisa mempertimbangkannya

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Dari pada

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

Nilai yang Anda perlukan untuk mengatur @x adalah 0untuk menonaktifkannya.

Ini tidak digunakan lagi untuk pernyataan modifikasi data tetapi tidak usang untuk SELECT.

Pada 2012 sebuah rencana berbeda dikompilasi untuk case yaitu ROWCOUNT0 vs beberapa nilai bukan nol.

Jika ORDER BY Bazhanya ada di sana untuk memberi makna kepada TOPdaripada memberikan urutan presentasi untuk hasil dan Anda tidak memiliki indeks yang mendukung ini maka membaginya menjadi dua pertanyaan akan menghindari jenis yang tidak perlu dalam 0kasus ini.

Martin Smith
sumber
8

SELECT TOP 100 PERSEN dapat digunakan untuk memotong kesalahan dengan menggunakan "TOP" dalam permintaan.

MguerraTorres
sumber
1
Bagi saya, itu tidak menjelaskan alasan untuk menggunakan fitur yang dioptimalkan. Apakah Crystal Reports mengharapkan ORDER BY berada di sana dalam definisi tampilan?
Andriy M
Tidak, Crystal Reports memiliki masalah dengan menangani pertanyaan dan memaksakan rencana pelaksanaannya sendiri, membuatnya sangat tidak efisien dan terkadang tidak akurat. Saya lebih suka melakukan SEMUA logika dan desain saya dalam query SQL, dan membuatnya "cantik" di Crystal. Inilah sebabnya mengapa saya, sebagian besar, telah bermigrasi ke SSIS / SSR, tetapi masih ada laporan lama di luar sana.
MguerraTorres
-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable
Abhilash Medi
sumber
1
Pertanyaannya adalah tentang parametris klausa TOP. OP sudah memiliki parameter ( @x) di sana, dan mereka sekarang menanyakan nilai apa yang harus diteruskan @xsehingga itu berarti "semua baris" terlepas dari berapa banyak baris yang sebenarnya dimiliki tabel. Mungkin Anda bisa mencari tahu bagaimana menyesuaikan solusi Anda agar sesuai dengan persyaratan OP.
Andriy M
1
Saya telah membuat penyesuaian agar sesuai dengan pertanyaan, meskipun seperti yang tertulis ini memiliki kondisi ras jika baris dimasukkan secara bersamaan. Ini akan membutuhkan kunci meja untuk durasi untuk menyelesaikan yang memblokir sisipan bersamaan. Ini dan biaya tambahan untuk memeriksa di tempat pertama dapat dihindari dengan hanya menggunakan sejumlah besar.
Martin Smith
(SELECT COUNT(*) FROM YourTable)bukan nilai.
ypercubeᵀᴹ