SQLによって影響を受けた行数(処理件数)を取得する@@ROWCOUNT [SQLServer]

SQL Server SELECT @@ROWCOUNT

SQLServerでは、直前に実行したSQLによって影響を受けた行数(処理件数)を内部で保持しています。SQLによって影響を受けた行数(処理件数)は、@@ROWCOUNTにセットされますので、@@ROWCOUNTの値をSELECTステートメントで実行することで、影響を受けた行数(処理件数)を取得することができます。また、IFステートメントなどを利用して、直前に実行したSQLによって、行が影響を受けたかどうかを知ることもできます。

使用するテーブル

サンプルコード(SQL)の記述に使用するテーブルを作成します。

テーブルの定義

PERSONテーブル
列名 データ型 主キー
PERSON_ID int
PERSON_NAME nvarchar(20)
GENDER tinyint

テーブルのSQL

CREATE

INSERT

上記のPERSONテーブルへのデータのインサートは、1回の実行で複数のレコードを挿入する形式のSQLで記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

SELECTステートメントの実行件数

SELECTをSQLで実行した時の@@ROWCOUNTの値の取得結果です。

実行結果

3

テーブルには3レコード登録されていますので、取得されるレコードの3が@@ROWCOUNTに保持されています。

取得するデータの条件を追加して再度実行してみます。

実行結果

2

WHERE句でGENDERの条件を「1」のみにして実行すると、取得されるレコードは2件になりますので、@@ROWCOUNTの値も2になります。

SELECTステートメントでは取得するレコードの数が@@ROWCOUNTにセットされます。

INSERTステートメントの実行件数

INSERTをSQLで実行した時の@@ROWCOUNTの値の取得結果です。

実行結果

1

@@ROWCOUNTに保持されるのは直前に実行したSQLによって影響を受けた行数(処理件数)なので、INSERTを2回連続で実行しても@@ROWCOUNTには1が保持されています。

INSERTステートメントの記述方法を変更して再度実行してみます。

実行結果

3

1回のINSERTで複数行のレコードを追加する形式で実行すると
@@ROWCOUNTには、挿入した全レコード(上記の例では3)が保持されます。

UPDATEステートメントの実行件数

UPDATEをSQLで実行した時の@@ROWCOUNTの値の取得結果です。

実行結果

3

WHERE句で更新対象となるレコードの条件を指定して再度実行してみます。

実行結果

2

UPDATEステートメントでは更新対象となったレコードの数が@@ROWCOUNTにセットされます。

DELETEステートメントの実行件数

DELETEをSQLで実行した時の@@ROWCOUNTの値の取得結果です。

実行結果

3

WHERE句で更新対象となるレコードの条件を指定して再度実行してみます。

実行結果

2

DELETEステートメントでは削除対象となったレコードの数が@@ROWCOUNTにセットされます。

PRINTステートメントの実行後

実行結果

0

PRINTステートメントを実行すると、@@ROWCOUNTには0がセットされます。(1はセットされません。)

Transaction

トランザクション処理を行い、テーブルを更新した後にCOMMIT、またはROLLBACKをして@@ROWCOUNTの値を取得します。

COMMIT

実行結果

0

ROLLBACK

実行結果

0

COMMIT、ROLLBACKともに、@@ROWCOUNTには0がセットされます。

トランザクション処理を行う場合には、INSERT、UPDATE、DELETEを実行した直後に、変数に@@ROWCOUNTの値を保持する必要があります。

実行結果

2

@@ROWCOUNT と同様の関数 ROWCOUNT_BIG

@@ROWCOUNTと同様に、直前に実行したSQLによって影響を受けた行数(処理件数)は、ROWCOUNT_BIG関数で取得することもできます。

実行結果

3

SQLで実行した結果、影響を受けた行数が20億を超える場合は、@@ROWCOUNTではなく、ROWCOUNT_BIG関数を使用する必要があるようです。
@@ROWCOUNT (Transact-SQL)
ROWCOUNT_BIG (Transact-SQL)