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

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

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

Вы используете SQL 2005 или 2008?

Brian Kim 07.10.2008 00:11

Запуск SQL Server 2005 в настоящее время

eddiegroves 07.10.2008 00:22
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
327
2
140 588
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

SELECT TOP (@count) * FROM SomeTable

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

Я тоже всегда забываю круглые скобки.

John Sheehan 07.10.2008 00:10

отлично! все это время я думал, что мне нужно использовать динамический sql.

Laguna 21.02.2012 00:09

Кто еще здесь, чтобы понять глупую ошибку в своем запросе, не добавив круглых скобок?

Raghav 06.09.2019 10:52

Ты спас мне день! Думал только для этого переместить все в динамический запрос!

Altaf Patel 23.01.2020 17:24

Я забыл *: D

user1683987 15.01.2021 20:57

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

set rowcount @top

select * from sometable

set rowcount 0 

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

Ойсин.

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

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

Brian Kim 07.10.2008 00:40

В примере x0n это должно быть:

SET ROWCOUNT @top

SELECT * from sometable

SET ROWCOUNT 0

http://msdn.microsoft.com/en-us/library/ms188774.aspx

Также можно использовать динамический 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)

Но будьте (очень) осторожны с Атаки с использованием SQL-инъекций при таком подходе.

MadSkunk 23.11.2015 14:05

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

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;

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

Другие вопросы по теме