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句を指定しきることと、変数テーブルに挿入する情報は(インデックスを使えるように)最小の情報にとどめること。さらに情報が欲しい場合は最後の結合で同じテーブルと結合し直す。
この辺はクエリアナライザで実行プランを眺めながらやると、最適解が得られると思う。
こんなめんどくさいことをやらなくてもいいような気がするが、昔自分が悩んで辿り着いた方法なので、どっかで役に立つことがあるかも。