Je veux utiliser de manière dynamique la top ou pas comme ça ...
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
8 Réponses :
Je ne pense pas que cela soit possible car top code> est appliqué non seulement une colonne mais toute la ligne. Vous devriez créer deux relevés de sélection différentes et les mettre dans un si sinon code> construire. P>
Bien que la déclaration concernant le sommet applicable à une rangée entière non une colonne est correcte, cela peut être atteint! Voir la réponse de SPE109!
Une réponse courte est non, pas la façon dont vous l'avez.
Vous pouvez cependant utiliser si code> pour tester et exécuter une requête différente: p>
Je viens d'utiliser quelque chose comme ceci: -
Deux options: SQL conditionnel SQL ou SQL dynamique.
(1) Conditionnel: P>
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
Je ne pense pas que vous puissiez.
Vous pouvez utiliser dynamique SQL: P> ou vous pouvez définir rowcount code> p>
Ceci a été utile et j'ai modifié un descs stockés à dynamiser en disant si @maxrows> 0 commencez RowCount @maxrows terminé code>, interrogation, puis réglage de RowCount vers 0 immédiatement après la requête.
J'espère avoir compris votre problème: vous souhaitez sélectionner les 5 premières lignes si vous passez @somenenumber = 0 d'autre Sélectionnez toutes les lignes Etables
comme première mise en œuvre consécutive, vous pouvez faire quelque chose comme ça P> Vous pouvez modifier la valeur du paramètre afin d'avoir combien de lignes que vous souhaitez p> sinon je vous suggère de mettre en œuvre une procédure stockée (et peut-être que vous Le fait, sinon vous pouvez suivre les étapes suivantes afin de le faire) p> alors vous pouvez appeler p> Je n'ai probablement pas répondu à votre question mais laissez-moi savoir si cela vous a aidé p> p>
Sélectionnez Top (Select @SomenNumber) est parfait.
Une autre échappatoire: utilisez la sous-requête avec la fonction Row_Number
DECLARE @DoTopJN AS bit
SET @DoTopJN = 0 -- or 1
SELECT X.Sequence
X.COLUMNA
--etc
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Y.Code) AS Sequence
,Y.COLUMNA
,Y.COLUMNB
-- etc.
FROM Y) X
WHERE ((@DoTopJN = 0) OR (X.Sequence = 1))
Pour corriger le code de SPE109:
DECLARE @SomeNumber INT = 0 DECLARE @SQL nvarchar(max), @Params nvarchar(max) set @Params = N'' SELECT @SQL = N'SELECT ' + CASE WHEN @SomeNumber = 0 THEN '' ELSE 'TOP ' + CAST(@SomeNumber as varchar) END + ' COLUMNNAME FROM TABLE' exec sp_executesql @SQL, @Params
Vous devez également commenter ci-dessous leur réponse ou poser une nouvelle question avec ce qui ne fonctionne pas avec leur solution pour vous (car cela était déjà marqué comme la réponse)
Je ne peux pas commenter ci-dessous leur réponse car cela nécessite que je dispose de 50 points de réputation malheureusement. Cependant, j'ai testé la "réponse acceptée" et produit un code SQL non valide (erreur de syntaxe).
La réponse acceptée produit ce code: Sélectionnez 5 cas où 0 TOP 5 TOP 5 ColumnName ElseName Fin de la table CODE> MSG 156, niveau 15, état 1, ligne 1 Syntaxe incorrecte près du mot-clé "cas".