J'autorise l'utilisateur final à définir le nombre de lignes renvoyées par une requête (SELECT TOP (@x)). Y a-t-il une valeur qui peut être entrée où toutes les lignes sont retournées? Ou dois-je créer dynamiquement la requête sans TOP (@x) s'ils veulent que toutes les lignes soient retournées?
J'utilise SQL Server 2012.
sql-server
Wayne E. Pfeffer
la source
la source
TOP ... ORDER BY
quelque chose? Est-ce queORDER BY
quelque chose est toujours requis dans le cas où vous sélectionnez tout?TOP
hors de question? Comme si vous avez affaire à une requête prédéfinie et que vous devez lui transmettre quelque chose ?Réponses:
Eh bien, il semble que TOP soit un BIGINT si vous n'utilisez pas un PERCENT . Cela signifie que vous pouvez transmettre la valeur maximale de BIGINT ,
Je doute sérieusement que vous verrez jamais une table aussi grande. Je ne sais pas quel type d'effet cela aurait sur le plan de requête.
la source
@x
est un BIGINT, celaSET @x = 0x7fffffffffffffff
peut être plus clair pour certains. C'est plus facile à retenir de toute façon.7
, puis le reste estF
et vous avez besoin de 16 caractères au total pour les 8 octets. Et oui, il sera implicitement converti s'il est attribué à une variable de ce type de données.0x7fffffffffffffff
représentation de la valeur maximale debigint
SqlServer. La raison en est que dans la notation constante binaire SqlServer, vous avez7f
dans l' octet le plus bas , où, comme dans les langages comme c ++, vous l'avez dans l' octet le plus élevé pour obtenir le maximum du type intégral signé.Vous pourriez également envisager
Au lieu de
La valeur à laquelle vous devez définir @x est
0
de le désactiver.Ceci est déconseillé pour les instructions de modification de données mais pas déconseillé pour
SELECT
.En 2012, un plan différent est compilé pour le cas qui
ROWCOUNT
est 0 contre une valeur non nulle.Si le
ORDER BY Baz
est uniquement là pour donner un sens auTOP
plutôt que pour fournir un ordre de présentation des résultats et que vous n'avez pas d'index le supportant, alors la division en deux requêtes éviterait un tri inutile dans le0
cas.la source
SELECT TOP 100 PERCENT peut être utilisé pour contourner toute erreur lors de l'utilisation de "TOP" dans une requête.
la source
la source
@x
) là-bas, et ils demandent maintenant à quelle valeur passer@x
afin que cela signifie «toutes les lignes» quel que soit le nombre de lignes que la table possède réellement. Peut-être pourriez-vous comprendre comment adapter votre solution aux exigences du PO.(SELECT COUNT(*) FROM YourTable)
n'est pas une valeur.