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


308

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

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

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)


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.