SQL Server 2000でoffsetがないのでページングをどうするか

昔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句を指定しきることと、変数テーブルに挿入する情報は(インデックスを使えるように)最小の情報にとどめること。さらに情報が欲しい場合は最後の結合で同じテーブルと結合し直す。

この辺はクエリアナライザで実行プランを眺めながらやると、最適解が得られると思う。

こんなめんどくさいことをやらなくてもいいような気がするが、昔自分が悩んで辿り着いた方法なので、どっかで役に立つことがあるかも。