SQL Server で ROWCOUNT_BIG() 関数を使用して削除された行数をカウントする

2024-04-06

SQL Server ストアド プロシージャ内で削除された行数をカウントするには、いくつかの方法があります。

方法

@@ROWCOUNTを使用する

これは最も簡単な方法ですが、いくつかの制限があります。

  • DELETE ステートメントが単一のテーブルに対して実行されている必要があります。
  • OUTPUT 句を使用することはできません。
  • トランザクション内で実行されている必要があります。

以下の例は、Customers テーブルから削除された行数をカウントする方法を示しています。

USE AdventureWorks2019;

GO

CREATE PROCEDURE [dbo].[usp_DeleteCustomer]
    @CustomerID int
AS
BEGIN

    DELETE FROM Customers
    WHERE CustomerID = @CustomerID;

    SELECT @@ROWCOUNT AS DeletedRows;

END;

GO

EXEC [dbo].[usp_DeleteCustomer] 1;

OUTPUT 句を使用する

@@ROWCOUNT の制限を回避するには、OUTPUT 句を使用して削除された行数をカウントできます。

USE AdventureWorks2019;

GO

CREATE PROCEDURE [dbo].[usp_DeleteCustomer]
    @CustomerID int
AS
BEGIN

    DELETE FROM Customers
    OUTPUT DELETED.*
    WHERE CustomerID = @CustomerID;

END;

GO

DECLARE @DeletedRows int;

EXEC [dbo].[usp_DeleteCustomer] 1, @DeletedRows OUTPUT;

SELECT @DeletedRows AS DeletedRows;

トリガーを使用する

削除された行数を監査する必要がある場合は、トリガーを使用できます。

USE AdventureWorks2019;

GO

CREATE TRIGGER [dbo].[tr_Customer_Delete]
ON [dbo].[Customers]
AFTER DELETE
AS
BEGIN

    INSERT INTO AuditLog (TableName, RowsDeleted)
    VALUES ('Customers', @@ROWCOUNT);

END;

GO

DELETE FROM Customers
WHERE CustomerID = 1;

SELECT * FROM AuditLog;

テーブル変数を使用して、削除される行を一時的に保存し、その数をカウントできます。

USE AdventureWorks2019;

GO

DECLARE @DeletedCustomers TABLE (
    CustomerID int,
    FirstName varchar(50),
    LastName varchar(50)
);

INSERT INTO @DeletedCustomers
SELECT *
FROM Customers
WHERE CustomerID = 1;

DELETE FROM Customers
WHERE CustomerID = 1;

SELECT COUNT(*) AS DeletedRows
FROM @DeletedCustomers;

使用する方法は、要件と環境によって異なります。

その他の考慮事項

  • 削除された行数を正確にカウントするには、トランザクション内で実行する必要があります。
  • 削除された行の情報を保存する必要がある場合は、OUTPUT 句またはトリガーを使用する必要があります。



USE AdventureWorks2019;

GO

CREATE PROCEDURE [dbo].[usp_DeleteCustomer]
    @CustomerID int
AS
BEGIN

    DELETE FROM Customers
    WHERE CustomerID = @CustomerID;

    SELECT @@ROWCOUNT AS DeletedRows;

END;

GO

EXEC [dbo].[usp_DeleteCustomer] 1;
USE AdventureWorks2019;

GO

CREATE PROCEDURE [dbo].[usp_DeleteCustomer]
    @CustomerID int
AS
BEGIN

    DELETE FROM Customers
    OUTPUT DELETED.*
    WHERE CustomerID = @CustomerID;

END;

GO

DECLARE @DeletedRows int;

EXEC [dbo].[usp_DeleteCustomer] 1, @DeletedRows OUTPUT;

SELECT @DeletedRows AS DeletedRows;
USE AdventureWorks2019;

GO

CREATE TRIGGER [dbo].[tr_Customer_Delete]
ON [dbo].[Customers]
AFTER DELETE
AS
BEGIN

    INSERT INTO AuditLog (TableName, RowsDeleted)
    VALUES ('Customers', @@ROWCOUNT);

END;

GO

DELETE FROM Customers
WHERE CustomerID = 1;

SELECT * FROM AuditLog;

テーブル変数を使用する

USE AdventureWorks2019;

GO

DECLARE @DeletedCustomers TABLE (
    CustomerID int,
    FirstName varchar(50),
    LastName varchar(50)
);

INSERT INTO @DeletedCustomers
SELECT *
FROM Customers
WHERE CustomerID = 1;

DELETE FROM Customers
WHERE CustomerID = 1;

SELECT COUNT(*) AS DeletedRows
FROM @DeletedCustomers;



削除された行数をカウントする他の方法

ROWCOUNT_BIG() 関数は、@@ROWCOUNT よりも大きな値をカウントできます。

USE AdventureWorks2019;

GO

CREATE PROCEDURE [dbo].[usp_DeleteCustomer]
    @CustomerID int
AS
BEGIN

    DELETE FROM Customers
    WHERE CustomerID = @CustomerID;

    SELECT ROWCOUNT_BIG() AS DeletedRows;

END;

GO

EXEC [dbo].[usp_DeleteCustomer] 1;

システムテーブルを使用する

sys.dm_tran_commit_table システムテーブルを使用して、コミットされたトランザクション内の削除された行数をカウントできます。

USE AdventureWorks2019;

GO

SELECT COUNT(*) AS DeletedRows
FROM sys.dm_tran_commit_table
WHERE object_id = OBJECT_ID('Customers')
AND operation = 'DELETE';

拡張ストアド プロシージャを使用して、削除された行数をカウントするカスタムロジックを実装できます。

第三者製ツールを使用する

削除された行数をカウントするサード者製ツールを使用できます。


sql-server t-sql audit


SQL ServerのGuid列におけるクラスター化インデックスのメリットとデメリット

SQL Server で Guid 列にクラスター化インデックスを作成するべきかどうかは、パフォーマンスとデータ整合性の要件に基づいて慎重に判断する必要があります。メリットとデメリットメリットGuid 列を主キーとして使用する場合、クラスター化インデックスはデータの挿入、更新、削除のパフォーマンスを向上させます。...


SQL Server 2008:Windows認証とSQL Server認証を使い分ける!混合モード設定の全手順

前提条件Microsoft SQL Server Management StudioがインストールされていることSQL Serverインスタンスへの管理者権限を持っていること手順オブジェクト エクスプローラーで、サーバーを右クリックし、「プロパティ」を選択します。...


SQLでROW_NUMBER()関数を使用して最初の行を取得する方法

TOP 句を使用すると、結果セットの最初のn行を取得できます。このクエリは、table テーブルの最初の行を返します。ROW_NUMBER() 関数は、各行に一意のシーケンス番号を割り当てます。OFFSET 句と FETCH 句を使用すると、結果セットの特定の部分を取得できます。...


CTE(Common Table Expression):前月の最初の日と最後の日を取得する可読性とメンテナンス性を向上させる方法

SQL Serverで前月の最初の日と最後の日を取得するには、いくつかの方法があります。ここでは、2つの代表的な方法をご紹介します。この方法は、EOMONTH関数とDATEADD関数を使用して、前月の最初の日と最後の日を計算します。説明EOMONTH関数: 指定した月の最後の日を返します。...


SQL ServerでDATENAME関数を使って今年最初の月の名前と最後の月の名前を取得する方法

SQL Server で今年最初の最後の日にちを取得するには、いくつかの方法があります。ここでは、3つの代表的な方法をご紹介します。方法 1: YEAR() と MONTH() 関数を使うこの方法は、最もシンプルで分かりやすい方法です。以下のクエリを実行することで、今年最初の日の日付と最後の日の日付を取得できます。...