TOP 句でもパラメータが使えます

SQL Server 2005 からは、TOP 句の 件数指定部分にパラメータが使えます。
TOP (Transact-SQL)
但し、正しい構文を使わないとエラーになってしまいます。そのため TOP 句でパラメータが使えないと思っている人が多い様な気がします。*1
正しい構文は、件数指定部分を括弧で囲みます。

DECLARE @cnt INT
SET @cnt = 2

SELECT TOP (@cnt) [No] FROM (
  SELECT 1 AS [No]
  UNION SELECT 2
  UNION SELECT 3
  UNION SELECT 4
  UNION SELECT 5 
) AS [TMP]

実行結果は、こちら

ちなみに、括弧で囲まないと…


では何故直接数値を指定した際には、括弧で囲まなくても動くかというとこちらに記載があります。

SELECT 句 (Transact-SQL) から引用

TOP expression [ PERCENT ] [ WITH TIES ] 
クエリの結果セットから、指定された最初の行セットまたは比率 (%) に相当する行だけが返されることを示します。expression は行数または行の比率 (%) にすることができます。 

TOP 句は SELECT、INSERT、UPDATE、および DELETE ステートメントで使用できます。INSERT、UPDATE、および DELETE の各ステートメントで TOP を使用する場合は、expression を区切るかっこが必要です。旧バージョンとの互換性を維持するため、SELECT ステートメント内でかっこを使用しないで TOP expression を使用する方法もサポートされていますが、この方法は推奨されていません。詳細については、「TOP (Transact-SQL)」を参照してください。

この部分ですね。

旧バージョンとの互換性を維持するため、SELECT ステートメント内でかっこを使用しないで TOP expression を使用する方法もサポートされていますが、この方法は推奨されていません。

ちなみに以前のバージョン(SQL Server 2000)では、パラメータは使えません。

マイクロソフト公式ダウンロード センターから 2007 年 6 月更新の SQL Server 2000 Books Online をダウンロード の tsqlref.chm の SELECT 句 より引用

SELECT 句
クエリで返される列を指定します。

構文
SELECT [ ALL | DISTINCT ]
    [ TOP n [ PERCENT ] [ WITH TIES ] ]
    <select_list>

〜〜 一部省略 〜〜

TOP n [PERCENT]

クエリの結果セットの先頭の n 行だけを出力することを指定します。n は 0 〜 4294967295 の整数です。PERCENT も指定すると、先頭の n % の行だけが結果セットから出力されます。PERCENT を指定した場合、n には 0 〜 100 の整数を指定する必要があります。

クエリに ORDER BY 句が含まれている場合は、並べ替えられた後で、最初の n 行 (または n %分の行) が出力されます。クエリに ORDER BY 句が含まれていない場合は、任意の順序で行が出力されます。

WITH TIES

ORDER BY のキー列の値が TOP n (PERCENT) の最終行と同じ値を持つ行を、基の結果セットから追加行として返すことを指定します。TOP ...WITH TIES は ORDER BY 句が指定されている場合にのみ使用できます。

という訳で、TOP 句を使う場合は、括弧で囲む様にしましょう!
※実は SSMS(SQL Server Management Studio) で出力されるクエリってこれ守ってないんですよね…。

*1:私もそうでした…