• 締切済み

カーソルを使って、最終行レコードの判断はどうすればよいのでしょうか。

カーソルを使って、最終行レコードの判断はどうすればよいのでしょうか。 処理はオーソドックスなスタイルでコーディングしているとします。 「ループ処理内で、FETCH NEXTした際に、最終行か判断したい」という質問です。 EOFで最終行だと判断するのは一般的ですが、ループ内で通常行と最終行の切り分けをしたいのです。特に何かの制約や事情があるわけではありませんので、実現できればそれでOKです。 要するに、最終行レコードが、通常行レコードの処理とかぶらなければ、用件は満たせるのですが、あまり懲りたくもないのもあって、ちょっと実装イメージが思い浮かばず、困ってます。 ご回答お願いします。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

#1,#2です。 @@CURSOR_ROWSが件数を返すのはSTATIC/KEYSETカーソルのみのはずです。 STATICは指定してますよね?

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

動的カーソルという言葉はどの意味でつかわれているのでしょうか? SQL Serverで動的カーソルと言えば、カーソル処理中もすべての更新が反映するカーソルのことですが。。。 でも、この手の処理にカーソルを使う発想がOracleっぽい気がしますので(SQL Serverでは普通カーソルは使わないケースです)、おそらくは「動的SQLをバインドしたカーソル」の意味でつかわれているのではないかと推測しました。 そうすると、サンプル以下の通りです。 DECLARE @FLD int DECLARE @CNT int DECLARE @sql varchar(MAX) SET @sql = 'DECLARE C CURSOR STATIC FOR SELECT FLD FROM TBL' EXEC (@sql) OPEN C SET @CNT=@@CURSOR_ROWS FETCH NEXT FROM C INTO @FLD WHILE (@@FETCH_STATUS=0) BEGIN SET @CNT=@CNT-1 IF (@CNT=0) PRINT 'LAST ROW:'+CONVERT(varchar,@FLD) ELSE PRINT 'REGULAR ROW:'+CONVERT(varchar,@FLD) FETCH NEXT FROM C INTO @FLD END CLOSE C DEALLOCATE C 読み違えていればごめんなさい。

Hyde_Works
質問者

補足

やりたいことの意図は合ってるのですが、うまくいきませんでした。 SET @CNT=@@CURSOR_ROWSの部分で、カーソルで拾ったレコード数が保持されていることを期待しましたが、マイナス値で、絶対値としてもレコード数とは違うようです。 当方のコーディングがヘマってるかもしれませんが… 他に追われて、なかなか調査しきれてませんが、SET @CNT=@@CURSOR_ROWSという箇所では、レコード数が取得できると思ってよいでしょうか。でないと、デクリメントしても意味ないですしね。動的にバインドしても成り立ちますよね。この部分が少し気になってます。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

凝ったことは必要ないならば、単純に件数で判断しては? DECLARE @FLD int DECLARE @CNT int DECLARE @C CURSOR SET @C = CURSOR FAST_FORWARD FOR SELECT FLD FROM TBL SET @CNT=@@ROWCOUNT OPEN @C FETCH NEXT FROM @C INTO @FLD WHILE (@@FETCH_STATUS=0) BEGIN  SET @CNT=@CNT-1  IF (@CNT=0) PRINT 'LAST ROW'  ELSE    PRINT 'REGULAR ROW'  FETCH NEXT FROM @C INTO @FLD END

Hyde_Works
質問者

補足

要件が足りてました。ごめんなさい。 (1) カーソルは動的カーソルで行いたい (2) 回答の例で付け加えで言いますと、@FLDを表示したい。 というイメージで、ご回答していただけたらうれしいです。 よろしくお願いします。

関連するQ&A