@@NESTLEVEL (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

現在のストアド プロシージャがローカル サーバーで実行中のトランザクションの入れ子レベルを返します (初期値は 0)。

Transact-SQL 構文表記規則

構文

@@NESTLEVEL  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

戻り値の型

int

解説

ストアド プロシージャが、別のストアド プロシージャを呼び出すか、または共通言語ランタイム (CLR) ルーチン、型、集計を参照してマネージド コードを実行するたびに、入れ子のレベルがインクリメントされます。 最大の 32 を超えると、トランザクションが終了します。

Transact-SQL 文字列内で @@NESTLEVEL が実行されると、返される値は、現在の入れ子レベルに 1 を加えた値になります。 sp_executesql を使用して @@NESTLEVEL が動的に実行されると、返される値は、現在の入れ子レベルに 2 を加えた値になります。

A. プロシージャで @@NESTLEVEL を使用する

次の例では、別のプロシージャを呼び出すプロシージャと、それぞれの @@NESTLEVEL 設定を表示するプロシージャの、2 つのプロシージャを作成します。

USE AdventureWorks2022;  
GO  
IF OBJECT_ID (N'usp_OuterProc', N'P')IS NOT NULL  
    DROP PROCEDURE usp_OuterProc;  
GO  
IF OBJECT_ID (N'usp_InnerProc', N'P')IS NOT NULL  
    DROP PROCEDURE usp_InnerProc;  
GO  
CREATE PROCEDURE usp_InnerProc AS   
    SELECT @@NESTLEVEL AS 'Inner Level';  
GO  
CREATE PROCEDURE usp_OuterProc AS   
    SELECT @@NESTLEVEL AS 'Outer Level';  
    EXEC usp_InnerProc;  
GO  
EXECUTE usp_OuterProc;  
GO  

結果セットは次のようになります。

Outer Level  
-----------  
1  
 
Inner Level  
-----------  
2

B. @@NESTLEVEL を呼び出す

次の例では、SELECTEXEC、および sp_executesql のそれぞれが @@NESTLEVEL を呼び出すときに、それらが返す値の違いを示します。

CREATE PROC usp_NestLevelValues AS  
    SELECT @@NESTLEVEL AS 'Current Nest Level';  
EXEC ('SELECT @@NESTLEVEL AS OneGreater');   
EXEC sp_executesql N'SELECT @@NESTLEVEL as TwoGreater' ;  
GO  
EXEC usp_NestLevelValues;  
GO  

結果セットは次のようになります。

Current Nest Level  
------------------  
1  
 
(1 row(s) affected)  
 
OneGreater  
-----------  
2  
 
(1 row(s) affected)  
 
TwoGreater  
-----------  
3  
 
(1 row(s) affected)

参照

構成関数 (Transact-SQL)
ストアド プロシージャの作成
@@TRANCOUNT (Transact-SQL)