Dynamic SELECT TOP @var W SQL Server

308

Jak mogę ustawić zmienną dynamiczną, która określa liczbę wierszy do zwrócenia w programie SQL Server? Poniżej nie jest poprawna składnia w SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
źródło
2
Czy korzystasz z SQL 2005 lub 2008?
Brian Kim,
Obecnie
uruchomiony program

Odpowiedzi:

561
SELECT TOP (@count) * FROM SomeTable

Działa to tylko z SQL 2005+

Brian Kim
źródło
52
Zawsze też zapominam o nawiasach.
John Sheehan,
14
to jest świetne! cały czas myślałem, że muszę użyć dynamicznego SQL.
Laguna
1
Kto jeszcze jest tutaj, aby uświadomić sobie głupi błąd w swoim zapytaniu, nie dodając nawiasów?
Raghav,
Uratowałeś mi dzień! Pomyślałem o przeniesieniu wszystkich zapytań dynamicznych tylko w tym celu!
Altaf Patel
41

Składnia „select top (@var) ...” działa tylko w SQL SERVER 2005+. W przypadku SQL 2000 możesz:

set rowcount @top

select * from sometable

set rowcount 0 

Mam nadzieję że to pomoże

Oisin.

(edytowane w celu zastąpienia @@ rowcount przez rowcount - dzięki sierpień)

x0n
źródło
1
Słyszałem, że można uzyskać niepoprawny numer wiersza za pomocą @@ RowCount, jeśli masz klucz główny z wieloma kolumnami. Czy to prawda?
Brian Kim,
4

Możliwe jest również użycie dynamicznego SQL i wykonanie go za pomocą polecenia exec:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)
Jan
źródło
8
Uważaj
4

Lub po prostu umieść zmienną w nawiasie

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
ShawnThompson
źródło
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
David Castro
źródło