Dynamic SELECT TOP @var Dalam SQL Server

308

Bagaimana saya bisa memiliki variabel dinamis yang mengatur jumlah baris untuk kembali dalam SQL Server? Di bawah ini bukan sintaks yang valid di SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
sumber
2
Apakah Anda menjalankan SQL 2005 atau 2008?
Brian Kim
Menjalankan SQL Server 2005 saat ini
eddiegroves

Jawaban:

561
SELECT TOP (@count) * FROM SomeTable

Ini hanya akan bekerja dengan SQL 2005+

Brian Kim
sumber
52
Saya selalu lupa tanda kurung juga.
John Sheehan
14
ini bagus! selama ini saya pikir saya harus menggunakan sql dinamis.
Laguna
1
Siapa lagi yang ada di sini untuk menyadari kesalahan konyol dalam permintaan mereka dengan tidak menambahkan tanda kurung?
Raghav
Kamu menyelamatkan hariku! Saya berpikir untuk memindahkan semua ke permintaan dinamis hanya untuk ini!
Altaf Patel
41

Sintaks "pilih atas (@var) ..." hanya berfungsi di SQL SERVER 2005+. Untuk SQL 2000, Anda dapat melakukan:

set rowcount @top

select * from sometable

set rowcount 0 

Semoga ini membantu

Oisin.

(diedit untuk mengganti @@ rowcount dengan rowcount - terima kasih augustlight)

x0n
sumber
1
Saya pernah mendengar bahwa mungkin untuk mendapatkan nomor baris yang salah dengan @@ RowCount jika Anda memiliki kunci primer multi-kolom. Benarkah itu?
Brian Kim
4

Juga dimungkinkan untuk menggunakan SQL dinamis dan menjalankannya dengan perintah exec:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)
Jan
sumber
8
Tetapi berhati-hatilah terhadap serangan injeksi SQL dengan pendekatan ini
MadSkunk
4

Atau Anda cukup meletakkan variabel dalam kurung

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
ShawnThompson
sumber
4
declare @rows int = 10

select top (@rows) *
from Employees
order by 1 desc -- optional to get the last records using the first column of the table
David Castro
sumber