TOP (Transact-SQL)
Spécifie que seul le premier ensemble de lignes sera renvoyé par la requête. L'ensemble de lignes peut être un nombre de lignes ou un pourcentage des lignes. L'expression TOP peut être utilisée dans les instructions SELECT, INSERT, UPDATE, MERGE et DELETE.
Syntaxe
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
Arguments
expression
Expression numérique qui définit le nombre de lignes renvoyées. expression est converti implicitement en une valeur float si PERCENT est défini. Si tel n'est pas le cas, l'expression est convertie en bigint.Les parenthèses qui délimitent expression dans TOP sont obligatoires dans les instructions INSERT, UPDATE, MERGE et DELETE. Pour la compatibilité descendante, TOP expression sans parenthèses dans les instructions SELECT est pris en charge, mais cette utilisation n'est pas recommandée.
Si la requête contient une clause ORDER BY, les expression premières lignes ou expression pour cent des lignes triées par la clause ORDER BY sont renvoyées. Lorsque la requête ne comprend pas de clause ORDER BY, l'ordre des lignes est arbitraire.
PERCENT
Indique que la requête renvoie seulement les premiers expression pour cent des lignes de l'ensemble de résultats.WITH TIES
Spécifie que des lignes supplémentaires doivent être renvoyées de l'ensemble de résultats de base avec la même valeur dans les colonnes ORDER BY apparaissant comme les dernières des TOP n (PERCENT) lignes. TOP...WITH TIES peut être défini uniquement dans les instructions SELECT, et seulement si une clause ORDER BY est spécifiée.Notes
L'ordre retourné pour la liaison des enregistrements est arbitraire. ORDER BY n'affecte pas cette règle.
Notes
TOP ne peut pas être utilisé en même temps que des instructions UPDATE et DELETE sur des vues partitionnées.
Les lignes référencées dans l'expression TOP qui sont utilisées avec INSERT, UPDATE, MERGE ou DELETE ne sont disposées dans aucun ordre particulier. TOP n retourne un nombre n aléatoire de lignes. Par exemple, l'instruction INSERT suivante contient la clause ORDER BY, mais cette clause n'affecte pas les lignes auxquelles l'instruction INSERT fait directement référence.
INSERT TOP (2) INTO Table2 (ColumnB)
SELECT ColumnA FROM Table1
ORDER BY ColumnA;
La clause ORDER BY de la requête précédente fait référence uniquement aux lignes qui sont retournées par l'instruction SELECT imbriquée. L'instruction INSERT choisit deux des lignes retournées par l'instruction SELECT. Pour que les deux premières lignes de la sous-requête SELECT soient insérées, réécrivez la requête comme suit.
INSERT INTO Table2 (ColumnB)
SELECT TOP (2) ColumnA FROM Table1
ORDER BY ColumnA;
SQL Server permet de mettre à jour des vues créées avec la clause TOP. La clause TOP étant incluse dans la définition de la vue, des lignes peuvent disparaître de la vue à la suite d'une mise à jour si le résultat ne répond plus aux conditions de l'expression TOP. Pour plus d'informations, consultez Modification de données par l'intermédiaire d'une vue.
L'expression TOP dans une requête n'affecte pas les instructions qui peuvent être exécutées à la suite de l'activation d'un déclencheur. Les tables insérées et mises à jour dans les déclencheurs montrent seulement les lignes réellement affectées par les instructions INSERT, UPDATE, MERGE ou DELETE.
Utilisation de TOP dans l'instruction MERGE
Lorsqu’elle est spécifiée dans l’instruction MERGE, la clause TOP est appliquée après la jointure de l’intégralité de la table source et de la table cible, et après la suppression des lignes jointes qui ne sont pas éligibles pour une opération de type INSERT, UPDATE ou DELETE. La clause TOP réduit le nombre de lignes jointes à la valeur spécifiée et les actions INSERT, UPDATE ou DELETE sont appliquées aux lignes jointes restantes sans respecter un ordre particulier. Les lignes ne sont donc pas réparties selon un ordre particulier dans le cadre des actions définies dans les clauses WHEN. Par exemple, la spécification de la clause TOP (10) affecte 10 lignes, dont 7 peuvent être mises à jour et 3 insérées, ou alors 1 ligne peut être supprimée, 5 mises à jour et 4 insérées, et ainsi de suite.
Étant donné que l'instruction MERGE effectue une analyse complète des tables source et cible, les performances d’E/S peuvent être affectées lorsque la clause TOP est utilisée pour modifier une table volumineuse en créant plusieurs lots. Dans ce scénario, il est important de s’assurer que tous les lots consécutifs traitent les nouvelles lignes. Pour plus d'informations, consultez Optimisation des performances de l'instruction MERGE.
Exemples
A. Utilisation de TOP avec des variables
L'exemple suivant utilise une variable pour obtenir les 10 premiers employés figurant dans la table dbo.Employee de la base de données AdventureWorks2008R2.
USE AdventureWorks2008R2;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO
B. Utilisation de TOP avec PERCENT et WITH TIES
L'exemple suivant obtient les 10 % des employés ayant le salaire le plus élevé et les retourne dans l'ordre décroissant en fonction du taux de salaire de base. En définissant WITH TIES, vous incluez également dans l'ensemble de résultats les employés dont le salaire est égal au salaire retourné le plus faible, même si cette opération entraîne un dépassement du seuil fixé de 10 % des employés.
USE AdventureWorks2008R2;
GO
SELECT TOP(10) PERCENT WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;