Ab SQL Server 2005 kann man TOP n über SELECT TOP (@n) … erledigen:
declare @n integer
set @n = 2select top (@n) a
from
(select 1 as a
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
) as t
order by a desc
Das liefert als Ergebnis
a
———–
6
5
(2 row(s) affected)
In früheren Versionen geht das leider nicht. Da hilft die Verwendung von set rowcount, das die Anzahl der zurückgegebenen Zeilen definiert:
declare @n integer
set @n = 2set rowcount @n
select distinct a
from
(select 1 as a
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
) as t
order by a desc
Das liefert das gleiche Ergebnis wie oben.
Allerdings muss man danach wieder
set rowcount 0
absetzen, damit alle nachfolgenden SQL-Statements in dieser Session wieder alle Datensätze zurückliefern.