sys.fn_get_sql (Transact-SQL)

適用対象:SQL Server

指定した SQL ハンドルの SQL ステートメントのテキストを返します。

重要

この機能は、Microsoft SQL Server の将来のバージョンで削除されます。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに sys.dm_exec_sql_text を使用してください。 詳細については、「 sys.dm_exec_sql_text (Transact-SQL)」を参照してください。

Transact-SQL 構文表記規則

構文

  
sys.fn_get_sql ( SqlHandle )  

引数

SqlHandle
ハンドル値です。 SqlHandlevarbinary(64) で、既定値はありません。

返されるテーブル

列名 データ型 説明
dbid smallint データベース ID。 アドホック SQL ステートメントおよび準備された SQL ステートメントの場合、ステートメントがコンパイルされたデータベースの ID。
objectid int データベース オブジェクトの ID。 アドホック SQL ステートメントの場合は NULL になります。
number smallint プロシージャがグループ化されている場合は、グループの番号を示します。

0 = エントリはプロシージャではありません。

NULL = アドホック SQL ステートメント
encrypted bit オブジェクトが暗号化されているかどうかを示します。

0 = 暗号化なし

1 = 暗号化
テキスト text SQL ステートメントのテキストです。 暗号化されているオブジェクトの場合は NULL になります。

解説

有効な SQL ハンドルは、 sys.dm_exec_requests (Transact-SQL) 動的管理ビューのsql_handle列から取得できます。

キャッシュに存在しなくなったハンドルを渡すと、fn_get_sql は空の結果セットを返します。 無効なハンドルを渡すと、バッチが停止し、エラー メッセージが返されます。

SQL Server データベース エンジンでは、一括コピー ステートメントや、8 KB を超える文字列リテラルを含むステートメントなど、一部の Transact-SQL ステートメントをキャッシュできません。 このようなステートメントに対するハンドルは、fn_get_sql では取得できません。

結果セットの テキスト 列は、パスワードを含む可能性があるテキストに対してフィルター処理されます。 監視されないセキュリティ関連のストアド プロシージャの詳細については、「 トレースのフィルター処理」を参照してください。

fn_get_sql関数は、 DBCC INPUTBUFFER コマンドに似た情報を返します。 DBCC INPUTBUFFER を使用できないため、fn_get_sql関数を使用できる場合の例を次に示します。

  • イベントの文字数が 255 文字を超える場合。

  • ストアド プロシージャの現在の入れ子レベルの最上位を返す必要がある場合。 たとえば、sp_1 と sp_2 という名前の 2 つのストアド プロシージャがある場合に、 sp_1 で sp_2 を呼び出し、sp_2 の実行中に sys.dm_exec_requests 動的管理ビューからハンドルを取得すると、fn_get_sql 関数では sp_2 に関する情報が返されます。 さらに fn_get_sql 関数では、現在の入れ子の最上位レベルにあるストアド プロシージャの完全なテキストが返されます。

アクセス許可

ユーザーには、サーバーに対する VIEW SERVER STATE 権限が必要です。

データベース管理者は、次の例のように fn_get_sql 関数を使用して、問題があるプロセスを診断できます。 この場合、まず問題があるセッション ID を特定した後、そのセッションに対する SQL ハンドルを取得します。次にそのハンドルで fn_get_sql を呼び出した後、開始オフセットと終了オフセットを使用して、問題があるセッション ID の SQL ステートメントを確認します。

DECLARE @Handle varbinary(64);  
SELECT @Handle = sql_handle   
FROM sys.dm_exec_requests   
WHERE session_id = 52 and request_id = 0;  
SELECT * FROM sys.fn_get_sql(@Handle);  
GO  

参照

DBCC INPUTBUFFER (Transact-SQL)
sys.sysのプロセス (Transact-sql)
sys.dm_exec_requests (Transact-SQL)