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)」を参照してください。
構文
sys.fn_get_sql ( SqlHandle )
引数
SqlHandle
ハンドル値です。 SqlHandle は既定 varbinary(64) です。
返されるテーブル
列名 | データ型 | 説明 |
---|---|---|
dbid | smallint | データベース ID。 アドホックおよび準備済み SQL ステートメントの場合、ステートメントがコンパイルされたデータベースの ID。 |
objectid | int | データベース オブジェクトの ID。 アドホック SQL ステートメントの場合は NULL になります。 |
数値 | smallint | プロシージャがグループ化されている場合は、グループの数を示します。 0 = エントリはプロシージャではありません。 NULL = アドホック SQL ステートメント |
暗号化 | bit | オブジェクトが暗号化されているかどうかを示します。 0 = 暗号化なし 1 = 暗号化 |
text | text | SQL ステートメントのテキストです。 暗号化されたオブジェクトの場合は NULL です。 |
解説
有効な SQL ハンドルは、 sys.dm_exec_requests (Transact-SQL) 動的管理ビューのsql_handle列から取得できます。
キャッシュに存在しなくなったハンドルを渡すと、fn_get_sql は空の結果セットを返します。 無効なハンドルを渡すと、バッチが停止し、エラー メッセージが返されます。
SQL Server データベース エンジンでは、一括コピー ステートメントや文字列リテラルが 8 KB を超えるステートメントなど、一部の Transact-SQL ステートメントをキャッシュできません。 このようなステートメントに対するハンドルは、fn_get_sql では取得できません。
結果セットの text 列は、パスワードを含むテキストに対してフィルター処理されます。 監視されないセキュリティ関連のストアド プロシージャの詳細については、「トレースのフィルター処理を参照してください。
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)