2010-06-24 2 views

Répondre

2

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 
0

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.

+0

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

1

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 
1

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

4

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 
17

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é

+1

SELECT TOP (SELECT @SomeNumber) est parfait. – BClaydon

1

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)) 
Questions connexes