昔SQL Server 2000でページングを実装していたときにやった方法をメモ。 そのときの環境はSQL Server 2000, IIS, レガシーASP, XML, XSLT。 SQL Server 2005では ROW_NUMBER という関数で簡単に実現できるらしい。 SQL Server 2000ではoffsetもlimitもないので、TOPとWHERE句でうまいこと出力を制限するやり方が一般的。 ここ を参照。 私の場合はカーソル( cursor )と変数テーブルを使って実装していた。(カーソルを使うとfor文みたいな繰り返し処理ができる) 方法としては条件で絞り込んだ(プライマリ)キー情報を取得するSQLをカーソルで定義する。 offsetは FETCH absolute で代替。FETCH nextでループしながら変数テーブルにinsertしていく、同時に行数をカウントしてlimitまでいったら終了。 この最小のテーブルと他のテーブルと結合して欲しい情報を出力。 ポイントはカーソルとして定義するSQLでWHERE句を指定しきることと、変数テーブルに挿入する情報は(インデックスを使えるように)最小の情報にとどめること。さらに情報が欲しい場合は最後の結合で同じテーブルと結合し直す。 この辺はクエリアナライザで実行プランを眺めながらやると、最適解が得られると思う。 こんなめんどくさいことをやらなくてもいいような気がするが、昔自分が悩んで辿り着いた方法なので、どっかで役に立つことがあるかも。