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

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+


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)


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)

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>;

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.