SQLServerでは、直前に実行したSQLによって影響を受けた行数(処理件数)を内部で保持しています。SQLによって影響を受けた行数(処理件数)は、@@ROWCOUNTにセットされますので、@@ROWCOUNTの値をSELECTステートメントで実行することで、影響を受けた行数(処理件数)を取得することができます。また、IFステートメントなどを利用して、直前に実行したSQLによって、行が影響を受けたかどうかを知ることもできます。
目次
使用するテーブル
サンプルコード(SQL)の記述に使用するテーブルを作成します。
テーブルの定義
列名 | データ型 | 主キー |
---|---|---|
PERSON_ID | int | ○ |
PERSON_NAME | nvarchar(20) | |
GENDER | tinyint |
テーブルのSQL
1 2 3 4 5 6 |
CREATE TABLE PERSON ( PERSON_ID int NOT NULL PRIMARY KEY, PERSON_NAME nvarchar(20) NOT NULL, GENDER tinyint NOT NULL ); |
1 2 3 4 5 6 |
INSERT INTO PERSON (PERSON_ID, PERSON_NAME, GENDER) VALUES (101, 'Henry', 1), (102, 'Nancy', 2), (103, 'James', 1); |
上記のPERSONテーブルへのデータのインサートは、1回の実行で複数のレコードを挿入する形式のSQLで記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
SELECTステートメントの実行件数
SELECTをSQLで実行した時の@@ROWCOUNTの値の取得結果です。
1 2 3 4 5 |
SELECT * FROM PERSON; SELECT @@ROWCOUNT; |
テーブルには3レコード登録されていますので、取得されるレコードの3が@@ROWCOUNTに保持されています。
取得するデータの条件を追加して再度実行してみます。
1 2 3 4 5 6 7 |
SELECT * FROM PERSON WHERE GENDER = 1; SELECT @@ROWCOUNT; |
WHERE句でGENDERの条件を「1」のみにして実行すると、取得されるレコードは2件になりますので、@@ROWCOUNTの値も2になります。
SELECTステートメントでは取得するレコードの数が@@ROWCOUNTにセットされます。
INSERTステートメントの実行件数
INSERTをSQLで実行した時の@@ROWCOUNTの値の取得結果です。
1 2 3 |
INSERT INTO PERSON (PERSON_ID, PERSON_NAME, GENDER) VALUES (201, 'Catherine', 2); INSERT INTO PERSON (PERSON_ID, PERSON_NAME, GENDER) VALUES (202, 'Ben', 1); SELECT @@ROWCOUNT; |
@@ROWCOUNTに保持されるのは直前に実行したSQLによって影響を受けた行数(処理件数)なので、INSERTを2回連続で実行しても@@ROWCOUNTには1が保持されています。
INSERTステートメントの記述方法を変更して再度実行してみます。
1 2 3 4 5 6 7 |
INSERT INTO PERSON (PERSON_ID, PERSON_NAME, GENDER) VALUES (301, 'Jennifer', 2), (302, 'Cris', 1), (303, 'Amanda', 2); SELECT @@ROWCOUNT; |
1回のINSERTで複数行のレコードを追加する形式で実行すると
@@ROWCOUNTには、挿入した全レコード(上記の例では3)が保持されます。
UPDATEステートメントの実行件数
UPDATEをSQLで実行した時の@@ROWCOUNTの値の取得結果です。
1 2 3 |
UPDATE PERSON SET PERSON_NAME = PERSON_NAME + '_Edit'; SELECT @@ROWCOUNT; |
WHERE句で更新対象となるレコードの条件を指定して再度実行してみます。
1 2 3 4 5 |
UPDATE PERSON SET PERSON_NAME = PERSON_NAME + '_Edit' WHERE GENDER = 1; SELECT @@ROWCOUNT; |
UPDATEステートメントでは更新対象となったレコードの数が@@ROWCOUNTにセットされます。
DELETEステートメントの実行件数
DELETEをSQLで実行した時の@@ROWCOUNTの値の取得結果です。
1 2 |
DELETE PERSON SELECT @@ROWCOUNT; |
WHERE句で更新対象となるレコードの条件を指定して再度実行してみます。
1 2 3 4 |
DELETE PERSON WHERE GENDER = 1; SELECT @@ROWCOUNT; |
DELETEステートメントでは削除対象となったレコードの数が@@ROWCOUNTにセットされます。
PRINTステートメントの実行後
1 2 3 4 5 6 |
SELECT * FROM PERSON; PRINT 'Print something'; SELECT @@ROWCOUNT; |
PRINTステートメントを実行すると、@@ROWCOUNTには0がセットされます。(1はセットされません。)
Transaction
トランザクション処理を行い、テーブルを更新した後にCOMMIT、またはROLLBACKをして@@ROWCOUNTの値を取得します。
COMMIT
1 2 3 4 5 |
BEGIN TRAN; UPDATE PERSON SET PERSON_NAME = PERSON_NAME + '_Edit'; COMMIT; SELECT @@ROWCOUNT; |
ROLLBACK
1 2 3 4 5 |
BEGIN TRAN; UPDATE PERSON SET PERSON_NAME = PERSON_NAME + '_Edit'; ROLLBACK; SELECT @@ROWCOUNT; |
COMMIT、ROLLBACKともに、@@ROWCOUNTには0がセットされます。
トランザクション処理を行う場合には、INSERT、UPDATE、DELETEを実行した直後に、変数に@@ROWCOUNTの値を保持する必要があります。
1 2 3 4 5 6 7 |
BEGIN TRAN; DELETE PERSON WHERE GENDER = 1; DECLARE @ROW_COUNT int = @@ROWCOUNT; COMMIT; SELECT @ROW_COUNT; |
@@ROWCOUNT と同様の関数 ROWCOUNT_BIG
@@ROWCOUNTと同様に、直前に実行したSQLによって影響を受けた行数(処理件数)は、ROWCOUNT_BIG関数で取得することもできます。
1 2 3 4 5 6 7 |
INSERT INTO PERSON (PERSON_ID, PERSON_NAME, GENDER) VALUES (301, 'Jennifer', 2), (302, 'Cris', 1), (303, 'Amanda', 2); SELECT ROWCOUNT_BIG(); |
SQLで実行した結果、影響を受けた行数が20億を超える場合は、@@ROWCOUNTではなく、ROWCOUNT_BIG関数を使用する必要があるようです。
@@ROWCOUNT (Transact-SQL)
ROWCOUNT_BIG (Transact-SQL)