Динамічний SELECT TOP @var на 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 

Сподіваюсь, це допомагає

Ойсін.

(відредаговано для заміни @@ 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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.