Dynamic SELECT TOP @var Trong SQL Server


308

Làm cách nào tôi có thể có một biến động thiết lập số lượng hàng cần trả về trong SQL Server? Dưới đây không phải là cú pháp hợp lệ trong SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

2
Bạn đang chạy SQL 2005 hay 2008?
Brian Kim

Hiện đang chạy SQL Server 2005
eddiegroves

Câu trả lời:


561
SELECT TOP (@count) * FROM SomeTable

Điều này sẽ chỉ hoạt động với SQL 2005+


52
Tôi luôn quên dấu ngoặc đơn.
John Sheehan

14
điều đó thật tuyệt! tất cả thời gian này tôi nghĩ rằng tôi phải sử dụng sql động.
Laguna

1
Ai khác ở đây để nhận ra sai lầm ngớ ngẩn trong truy vấn của họ bằng cách không thêm dấu ngoặc đơn?
Raghav

Bạn đã cứu ngày của tôi! Tôi nghĩ rằng để chuyển tất cả sang truy vấn động chỉ cho việc này!
Altaf Patel

41

Cú pháp "select top (@var) ..." chỉ hoạt động trong SQL SERVER 2005+. Đối với SQL 2000, bạn có thể làm:

set rowcount @top

select * from sometable

set rowcount 0 

Hi vọng điêu nay co ich

Ôi.

(được chỉnh sửa để thay thế @@ rowcount bằng rowcount - cảm ơn đèn chiếu sáng)


1
Tôi đã nghe nói rằng có thể lấy số hàng không chính xác bằng @@ RowCount nếu bạn có khóa chính nhiều cột. Điều đó có đúng không?
Brian Kim


4

Cũng có thể sử dụng SQL động và thực thi nó bằng lệnh 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
Nhưng hãy (rất) cảnh giác với các cuộc tấn công tiêm
nhiễm

4

Hoặc bạn chỉ cần đặt biến trong ngoặc đơn

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.