2025年12月12日金曜日

SQL Server システム関数の活用まとめ|@@ERROR・@@ROWCOUNT・@@IDENTITYなどの使い方

処理結果をすぐ確認!SQL Serverのシステム関数を使いこなす基本と実務活用例

SQL Serverには、処理結果や内部状態を確認するためのシステム関数が多数用意されています。 特に、@@ERROR・@@ROWCOUNT・@@IDENTITYなどはエラーハンドリングやログ記録など、 日常的な開発・運用で頻繁に利用されます。
この記事では、代表的なシステム関数の使い方と実務での活用例を 初心者向けに整理して紹介します。

目次

システム関数とは?

SQL Server内部の状態を取得できる特別な関数

システム関数は、SQL Serverの実行状態や結果に関する情報を返す特殊な関数です。 名前の先頭に「@@」が付くものが多く、変数のように扱います。

主な用途は以下のとおりです:

  • エラー発生状況の確認(@@ERROR)
  • 影響行数の確認(@@ROWCOUNT)
  • ID自動採番値の取得(@@IDENTITY)
  • トランザクション状態の確認(@@TRANCOUNT)

開発中のデバッグや実行結果のログ化に欠かせないツールです。

@@ERROR:直前のSQLエラーコードを取得

基本構文


UPDATE Products SET Price = Price / 0;
PRINT @@ERROR;

0除算エラーが発生すると、エラーコードが返されます。 0 = 正常終了、0以外 = エラーを意味します。

実務例:手動エラーチェック


UPDATE Orders SET Status = 'Shipped' WHERE OrderID = 1001;
IF @@ERROR <> 0
BEGIN
    PRINT '更新に失敗しました。';
END

TRY...CATCH構文を使わない簡易チェックに便利です。

@@ROWCOUNT:影響を受けた行数を取得

基本構文


DELETE FROM Customers WHERE City = 'Tokyo';
PRINT '削除行数:' + CAST(@@ROWCOUNT AS NVARCHAR(10));

直前のDML(INSERT/UPDATE/DELETE)で影響を受けた行数を返します。

実務例:処理結果のログ出力


UPDATE Products SET Stock = Stock - 1 WHERE ProductID = 101;
PRINT '更新件数:' + CAST(@@ROWCOUNT AS NVARCHAR(10));

特定条件の更新があったかどうかを確認する際に便利です。

@@IDENTITY:最後に挿入されたIDを取得

基本構文


INSERT INTO Customers (Name, City) VALUES ('Tanaka', 'Tokyo');
SELECT @@IDENTITY AS LastInsertedID;

自動採番列(IDENTITY)の最新値を取得します。

注意点

  • スコープ外(トリガー等)のINSERTでも値を返す
  • 安全な代替として SCOPE_IDENTITY() の利用が推奨

INSERT INTO Orders (CustomerID, Total) VALUES (1, 5000);
SELECT SCOPE_IDENTITY() AS SafeID;

同一セッション内・同一スコープのIDのみ取得します。

@@TRANCOUNT:現在のトランザクション数を確認

使用例


BEGIN TRANSACTION;
PRINT 'トランザクション数:' + CAST(@@TRANCOUNT AS NVARCHAR(10));
COMMIT TRANSACTION;

ネストされたトランザクションや、ストアドプロシージャ内での状態確認に利用します。

活用ポイント

  • 0 の場合:トランザクション外
  • 1以上:トランザクション中
  • ROLLBACK時にはすべてのレベルが解除

その他の代表的なシステム関数

関数名 説明
@@SERVERNAME サーバー名を返す
@@VERSION SQL Serverのバージョン情報を返す
@@SPID 現在のセッションIDを返す
@@LANGUAGE 現在のセッション言語を返す
@@CONNECTIONS サーバーへの累計接続数を返す

監査・診断クエリの一部として活用できます。

実務での組み合わせ活用例

エラー検出+影響行数+ログ出力


BEGIN TRY
    UPDATE Employees SET Salary = Salary * 1.05 WHERE Department = 'Sales';

    PRINT '更新件数:' + CAST(@@ROWCOUNT AS NVARCHAR(10));
    PRINT '更新完了しました。';
END TRY
BEGIN CATCH
    PRINT 'エラーコード:' + CAST(@@ERROR AS NVARCHAR(10));
END CATCH;

このように組み合わせることで、処理結果の確認・障害調査が容易になります。

まとめと次のステップ

学んだ内容の整理

  • @@ERROR:直前のSQL実行エラーを検出
  • @@ROWCOUNT:影響を受けた行数を確認
  • @@IDENTITY:直近のINSERT IDを取得(SCOPE_IDENTITY推奨)
  • @@TRANCOUNT:トランザクション状態を確認
  • これらを組み合わせて堅牢なエラーハンドリングを実現できる
SQL Server学習シリーズ
◀ 【第4回】ユーザー定義関数(UDF)まとめ
【第3章】【第1回】データ型の基礎と選び方 ▶
目次へ

🔸次回から 第3章:データ定義・設計(DDL/モデリング) に進みます。
テーブル構造・データ型・制約・スキーマなど、データベース設計の基礎を体系的に学びましょう。

参考リンク

SQL Server 解説用イメージ

0 件のコメント:

コメントを投稿