T-SQLの@@ROWCOUNTについて
T-SQLのシステム関数に「@@ROWCOUNT」と言うものがあります。
直前に影響のあった件数を知りたい時に気軽に使える関数ですが、
「@@ROWCOUNT」の仕様を理解していないと、
想定と異なった動きをすることがあります。
対象のテーブルの状態
@@ROWCOUNTを使用した場合
SELECT count(*) FROM sampleDB.dbo.emp WHERE empno = 10 RETURN @@rowcount
取得結果
対象のテーブルを観てもらえれば分かる通り、
該当する行数は0のはずですが、
@@ROWCOUNT関数は1を返しています。
これは、直前に実行したクエリによって影響の受ける行数、
または読み取られる行の数を保持するためです。
上記の例ではCOUNTを使用しましたが、
他にはINSERTなどで、2件、行を挿入した場合でも、
@@ROWCOUNTの結果は1件となります。
よって、このような場合では@@ROWCOUNTを使用せずに、
自前の変数に結果を格納して、
返してやる必要があります。
@@ROWCOUNTを使用せずに件数を返す場合
DECLARE @RowCount AS INT SELECT @RowCount = count(*) FROM sampleDB.dbo.emp WHERE empno = 10 RETURN @RowCount
取得結果
まとめ
- @@ROWCOUNTは、影響を受ける件数、または読み取られる件数が設定される。
- その為、SELECT COUNTやINSERTでは、欲しい結果が得られない場合がある。
- そもそも@@ROWCOUNTはUPDATEやDELETE時に影響のあった件数を取得するために利用するもの。