select TOP (tous)

declare @t int set @t = 10 if (o = 'mmm') set @t = -1 select top(@t) * from table 

Que faire si je veux généralement qu'il en résulte 10 lignes, mais rarement tous.

Je sais que je peux le faire grâce à "SET ROWCOUNT". Mais y a-t-il un certain nombre de variables, comme -1, qui fait que TOP produit tous les éléments?

La plus grande valeur possible qui peut être transmise à TOP est 9223372036854775807 donc vous pourriez simplement passer cela.

Ci-dessous, j'utilise le formulaire binary pour bigint signé car il est plus facile de se souvenir tant que vous connaissez le motif de base et que bigint est de 8 octets.

 declare @t bigint = case when some_condition then 10 else 0x7fffffffffffffff end; select top(@t) * From table 

Si vous n'avez pas de clause order by, le top 10 sera simplement 10 et dépendra de l'optimization.

Si vous avez une clause order by pour définir le top 10 et un index pour le prendre en charge, alors le plan de la requête ci-dessus devrait convenir à chaque valeur possible.

Si vous ne disposez pas d'un index de prise en charge et que le plan affiche un sorting que vous devriez envisager de scinder en deux requêtes.

Je ne suis pas sûr de comprendre votre question.

Mais si vous voulez parfois TOP et d'autres fois n'utilisez pas simplement if / else:

 if (condition) 'send TOP SELECT TOP 10 Blah FROM... else SELECT blah1, blah2 FROM... 

Vous pouvez utiliser le SQL dynamic (mais, personnellement, essayez d'éviter le SQL dynamic), où vous créez une string de l'instruction que vous voulez exécuter à partir de conditions ou de parameters. Il y a aussi quelques bonnes informations ici sur la façon de le faire sans SQL dynamic:

http://sqlserver2000.databases.aspfaq.com/how-do-i-use-a-variable-in-a-top-clause-in-sql-server.html

une version SQL dynamic n'est pas difficile à faire.

 CREATE PROCEDURE [dbo].[VariableTopSelect] -- Add the parameters for the stored procedure here @t int AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; declare @sql nvarchar(max) if (@t=10) begin set @sql='select top (10) * from table' end else begin set @sql='select * from table' end exec sp_executesql @sql END 

avec ce sp, s'ils envoient 10 au sp, il va sélectionner le top 10, sinon il va tout sélectionner.

La meilleure solution que j'ai trouvée est de sélectionner les colonnes nécessaires avec toutes vos conditions dans une table temporaire, puis faites votre top conditionnel:

 DECLARE @TempTable TABLE(cols...) INSERT INTO @TempTable SELECT blah FROM ... if (condition) SELECT TOP 10 * FROM @tempTable else SELECT * FROM @tempTable 

De cette façon, vous suivez DRY, obtenez votre TOP conditionnel, et sont tout aussi faciles à lire.

À votre santé.

 declare @top bigint = NULL declare @top_max_value bigint = 9223372036854775807 if (@top IS NULL) begin set @top = @top_max_value end select top(@top) * from [YourTableName] 

C'est aussi possible avec UNION et un paramètre

 SELECT DISTINCT TOP 10 Column1, Column2 FROM Table WHERE @ShowAllResults = 0 UNION SELECT DISTINCT Column1, Column2 FROM Table WHERE @ShowAllResults = 1 

Utilisez l'instruction "SET ROWCOUNT @recordCount" au début de la requête de résultat. La variable "@recordCount" peut être n'importe quel entier positif. Il devrait être 0 pour returnner tous les loggings.

cela signifie que "SET ROWCOUNT 0" renverra tous les loggings et "SET ROWCOUNT 15" ne renverra que les 15 premières lignes du jeu de résultats.

Inconvénient peut être le succès de la performance lorsqu'il s'agit d'un grand nombre d'loggings. Le SET ROWCOUNT sera également efficace tout au long de l'exécution de la requête entière.