Je veux utiliser dynamiquement TOP ou non un peu comme ça ...Une clause TOP conditionnelle T-SQL est-elle possible?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
Je veux utiliser dynamiquement TOP ou non un peu comme ça ...Une clause TOP conditionnelle T-SQL est-elle possible?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
J'ai juste utilisé quelque chose comme ceci: -
Declare @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
Set @SQL = N'SELECT ' + Cast(@SomeNumber as varchar) + ' CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE'
exec sp_executesql @SQL, @Params
Je ne pense pas que cela est possible parce que TOP
est appliqué non seulement sur une colonne, mais toute la ligne. Vous devez créer deux instructions select différentes et les placer dans une construction IF ELSE
.
La réponse courte est non, pas comme vous l'avez.
Vous pouvez cependant utiliser IF
pour tester et exécuter une autre requête:
IF (@SomeNumber = 0)
BEGIN
SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
SELECT ColumnName FROM Table
END
Deux options: SQL conditionnelle ou SQL dynamique.
(1) sous condition:
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
(2) dynamique: construire la requête dans un varchar() et le transmettre à sp_execute
Je ne pense pas que vous pouvez.
Vous pouvez soit utiliser SQL dynamique:
Declare @int int
set @int = 10
exec ('Select top ' + @int + ' * From Customers')
Ou vous pouvez définir rowcount
if (@someNumber != 0)
begin
set rowcount 5
end
select * From Customers
set rowcount 0
J'espère avoir compris votre problème: vous voulez sélectionner le TOP 5 lignes si vous passez @ SomeNumber = 0 sinon sélectionnez toutes les lignes compatibles
Comme première implémentation droite, vous pouvez faire quelque chose comme ça
declare @SomeNumber as int
set @SomeNumber = 5
-- set @SomeNumber = 1
SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE
vous pouvez modifier la valeur du paramètre afin d'avoir le nombre de lignes que vous voulez
Sinon, je vous suggère de mettre en œuvre une procédure stockée (et peut-être que vous avez déjà fait cela, sinon vous pouvez suivre la prochaines étapes afin de le faire)
CREATE procedure [dbo].[TOPCLAUSE]
-- clause parameter
@SomeNumber as integer
AS
IF @SomeNumber = 0
BEGIN
SELECT TOP 5 COLUMNNAME FROM MYTABLE
END
ELSE
BEGIN
SELECT COLUMNNAME FROM MYTABLE
END
GO
Ensuite, vous pouvez appeler
exec [dbo].[TOPCLAUSE] 0
exec [dbo].[TOPCLAUSE] 1
Je probablement pas répondu à votre question, mais laissez-moi savoir si cela vous a aidé
SELECT TOP (SELECT @SomeNumber) est parfait. – BClaydon
Une autre lacune: utiliser des années de sous-requêtes avec 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))
Alors que la déclaration concernant le dessus application à une ligne entière non une colonne est correct, cela peut être réalisé! voir la réponse de SPE109! – OneSHOT