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

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+


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)


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)

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>;

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.