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]
実行結果は、こちら
ちなみに、括弧で囲まないと…
では何故直接数値を指定した際には、括弧で囲まなくても動くかというとこちらに記載があります。
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:私もそうでした…