T-SQLの@@ROWCOUNTについて

T-SQLのシステム関数に「@@ROWCOUNT」と言うものがあります。
直前に影響のあった件数を知りたい時に気軽に使える関数ですが、
「@@ROWCOUNT」の仕様を理解していないと、
想定と異なった動きをすることがあります。

対象のテーブルの状態

f:id:HTak:20130527222703p:plain

@@ROWCOUNTを使用した場合

SELECT
  count(*)
FROM
  sampleDB.dbo.emp
WHERE
  empno = 10
 
RETURN @@rowcount

取得結果

f:id:HTak:20130527222922p:plain

対象のテーブルを観てもらえれば分かる通り、
該当する行数は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

取得結果

f:id:HTak:20130527223149p:plain

まとめ

  • @@ROWCOUNTは、影響を受ける件数、または読み取られる件数が設定される。
  • その為、SELECT COUNTやINSERTでは、欲しい結果が得られない場合がある。
  • そもそも@@ROWCOUNTはUPDATEやDELETE時に影響のあった件数を取得するために利用するもの。