2009-12-18 8 views

risposta

286

Sì, in SQL Server 2005 è possibile utilizzare una variabile nella clausola top.

select top (@top) * from tablename 
+0

Grazie per il vostro sforzo, davvero aiutato per me!!! – Paresh

+0

è completamente strano ... non ero a conoscenza di questo e sono rimasto bloccato per alcuni minuti su questo. Grazie (+1) – Christos

38

SQL Server 2005 ci consente in realtà di parametrizzare la clausola TOP, utilizzando una variabile, un'espressione o un'istruzione. Così si può fare cose come:

SELECT TOP (@foo) a FROM table ORDER BY a 

SELECT TOP (SELECT COUNT(*) FROM somewhere else) a FROM table ORDER BY a 

SELECT TOP (@foo + 5 * 4/2) a FROM table ORDER BY a 

Source

24

Nel 2005 e in seguito, è possibile farlo in quanto vi sono diverse risposte in questa discussione.

Che cosa è meno noto è che è possibile ottenere questo anche in 2k, utilizzando SET ROWCOUNT.

-- Works in all versions 
    SELECT TOP 10 

    -- Does not work on 2000 
    SELECT TOP (10) 
    SELECT TOP (@rows) 

    -- Works in both 2ooo and 2oo5 
    SET ROWCOUNT @max 

    SELECT * 
    FROM ... 

    SET ROWCOUNT 0 

nota, se si dimentica il SET ROWCOUNT 0 alla fine, il limite persiste .. e si finirà con molto difficile da individuare bug :-)

+4

Si noti inoltre che SET ROWCOUNT non influenza il piano di esecuzione, quindi l'utilizzo di TOP è preferibile in SQL 2005. – Guffa

+0

Grazie per la risposta alternativa – Paresh

+2

+1 per la discussione su 'SET ROWCOUNT'. Questa non è la soluzione che ho usato, ma mi piace che tu l'abbia inventata – Sam