Динамический SELECT TOP @var In SQL Server

308

Как я могу иметь динамическую переменную, устанавливающую количество строк, возвращаемых в SQL Server? Ниже недопустимый синтаксис в SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
источник
2
Вы используете SQL 2005 или 2008?
Брайан Ким
В настоящее время работает SQL Server 2005
eddiegroves,

Ответы:

561
SELECT TOP (@count) * FROM SomeTable

Это будет работать только с SQL 2005+

Брайан Ким
источник
52
Я всегда забываю скобки тоже.
Джон Шихан
14
это круто! все это время я думал, что должен был использовать динамический sql.
Лагуна
1
Кто еще здесь, чтобы понять глупую ошибку в своем запросе, не добавляя скобки?
Raghav
Ты спас мой день! Я думал переместить все в динамический запрос только для этого!
Альтаф Патель
41

Синтаксис «select top (@var) ...» работает только в SQL SERVER 2005+. Для SQL 2000 вы можете сделать:

set rowcount @top

select * from sometable

set rowcount 0 

Надеюсь это поможет

Oisin.

(отредактировано для замены @@ rowcount на rowcount - спасибо augustlights)

x0n
источник
1
Я слышал, что можно получить неправильный номер строки с помощью @@ RowCount, если у вас есть первичный ключ из нескольких столбцов. Это правда?
Брайан Ким
4

Также возможно использовать динамический SQL и выполнить его с помощью команды 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
Но будьте (очень) осторожны с атаками SQL-инъекций с этим подходом
MadSkunk
4

Или вы просто поместите переменную в скобках

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
ShawnThompson
источник
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
Дэвид Кастро
источник