Dynamic SELECT TOP @var In SQL Server

308

Wie kann eine dynamische Variable die Anzahl der Zeilen festlegen, die in SQL Server zurückgegeben werden sollen? Unten ist keine gültige Syntax in SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
quelle
2
Führen Sie SQL 2005 oder 2008 aus?
Brian Kim
Derzeit wird SQL Server 2005 ausgeführt
eddiegroves

Antworten:

561
SELECT TOP (@count) * FROM SomeTable

Dies funktioniert nur mit SQL 2005+

Brian Kim
quelle
52
Ich vergesse auch immer die Klammern.
John Sheehan
14
das ist toll! Die ganze Zeit dachte ich, ich müsste dynamisches SQL verwenden.
Laguna
1
Wer ist noch hier, um den dummen Fehler in seiner Abfrage zu erkennen, indem er die Klammern nicht hinzufügt?
Raghav
Du hast meinen Tag gerettet! Ich dachte, alle nur dafür auf dynamische Abfrage umzustellen!
Altaf Patel
41

Die Syntax "select top (@var) ..." funktioniert nur in SQL SERVER 2005+. Für SQL 2000 können Sie Folgendes tun:

set rowcount @top

select * from sometable

set rowcount 0 

Hoffe das hilft

Oisin.

(bearbeitet, um @@ rowcount durch rowcount zu ersetzen - danke augustlights)

x0n
quelle
1
Ich habe gehört, dass es möglich ist, mit @@ RowCount eine falsche Zeilennummer zu erhalten, wenn Sie einen mehrspaltigen Primärschlüssel haben. Ist das wahr?
Brian Kim
4

Es ist auch möglich, dynamisches SQL zu verwenden und es mit dem Befehl exec auszuführen:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)
Jan.
quelle
8
Aber seien Sie (sehr) vorsichtig mit SQL-Injection-Angriffen mit diesem Ansatz
MadSkunk
4

Oder Sie setzen die Variable einfach in Klammern

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
Shawn Thompson
quelle
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
quelle