SQL ServerでSELECTの 20行目から40行目を取得するとか,そういうのは TOP 句を使った例としてネット上にたくさんありますが,本当にROWNUMを取得したいときのコードの例が結構少なかったのでここにメモしておきます。
ユーザ定義関数内でROWNUMを含んだテーブルを作り,それに対してSELECT文を実行する,という形で実装するようです。ユーザ定義関数が使えないとか,それをSELECTするSQL文が使えないとかいう状況はたくさんあると思いますが,そういう場合は,そもそも DataSet や カーソルを使って取得していて,ループで回せばわざわざROWNUMをSQL文で作らなくてもいい状況なんだと思います。私が今まで必要を感じてなかったのは,そういう方法で取得していたからでした。
http://diego18.at.webry.info/を参考にしました。(2004/09/06)
/* ユーザ定義関数 */ CREATE FUNCTION Hase_Udf_GetHogeReport ( @STARTDATETIME DATETIME, @ENDDATETIME DATETIME ) RETURNS @DUMMY_TABLE TABLE( ROWNUM int IDENTITY(1,1), ID NVARCHAR(256), TimeStamp DATETIME, Message NVARCHAR(256) ) AS BEGIN INSERT INTO @DUMMY_TABLE(ID, TimeStamp, Message) SELECT ID,TimeStamp,Message FROM HogeReport AND StartTime BETWEEN @STARTDATETIME AND @ENDDATETIME AND EndTime BETWEEN @STARTDATETIME AND @ENDDATETIME ORDER BY StartTime RETURN END /* SQLからの呼び出し方 */ SELECT * FROM Hase_Udf_GetHogeReport(@STARTDATETIME, @ENDDATETIME) /* ストアドプロシージャから呼び出す */ CREATE PROCEDURE Hase_GetHogeReport @STARTDATETIME DATETIME, @ENDDATETIME DATETIME AS BEGIN IF( @STARTDATETIME <= @ENDDATETIME ) BEGIN SELECT * FROM Hase_Udf_GetHogeReport(@STARTDATETIME, @ENDDATETIME) END END GO
HogeReportテーブルの構造が分からないともしかすると読みにくいですか?
ID NVARCHAR(256),
TimeStamp DATETIME,
Message NVARCHAR(256),
StartTime DATETIME,
EndTime DATETIME
というカラムのあるテーブルです。