2010-06-24 11 views

risposta

2

ho appena usato qualcosa di simile: -

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

non credo che questo è possibile perché TOP viene applicato non solo su una colonna, ma l'intera riga. Dovresti creare due diverse istruzioni select e inserirle in un costrutto IF ELSE.

+0

Mentre la dichiarazione per quanto riguarda superiore applicando a tutta una fila non una colonna è corretto, questo può essere raggiunto! vedi la risposta di SPE109! – OneSHOT

1

La risposta breve è no, non il modo in cui ce l'hai.

È possibile comunque utilizzare IF per testare ed eseguire una query diversa:

IF (@SomeNumber = 0) 
BEGIN 
    SELECT TOP 5 ColumnName FROM Table 
END 
ELSE 
BEGIN 
    SELECT ColumnName FROM Table 
END 
1

due opzioni: SQL condizionato o SQL dinamico.

(1) condizionale:

IF @SomeNumber = 0 
    SELECT TOP 5 COLUMNAME FROM TABLE 
ELSE 
    SELECT COLUMNAME FROM TABLE 

(2) dinamico: costruire la query in un varchar() e passarlo a sp_execute

4

non credo che puoi.

Si potrebbe usare sia SQL dinamico:

Declare @int int 

set @int = 10 

exec ('Select top ' + @int + ' * From Customers') 

Oppure si potrebbe impostare rowcount

if (@someNumber != 0) 
begin 
set rowcount 5 
end 

select * From Customers 

set rowcount 0 
17

spero di aver capito il problema: che si desidera selezionare la TOP 5 righe se si passa @ SomeNumber = 0 else seleziona tutte le righe etable

Come prima implementazione diritta puoi fare qualcosa del genere

declare @SomeNumber as int 

set @SomeNumber = 5 
-- set @SomeNumber = 1 

SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE 

è possibile modificare il valore del parametro in modo da avere quante righe si desidera


Altrimenti vi suggerisco di implementare una stored procedure (e magari avete già fatto che, in caso contrario è possibile seguire la prossimi passi al fine di farlo)

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 

quindi è possibile chiamare

exec [dbo].[TOPCLAUSE] 0 

exec [dbo].[TOPCLAUSE] 1 

Probabilmente non risposto alla tua domanda, ma fatemi sapere se ti ha aiutato

+1

SELECT TOP (SELECT @SomeNumber) è perfetto. – BClaydon

1

Un'altra scappatoia: fare uso di subquery di con la funzione 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)) 
Problemi correlati