次の方法で共有


sys.fn_get_sql (Transact-SQL)

指定した 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
    ハンドル値を指定します。 SqlHandle のデータ型は varbinary(64) で、既定値はありません。

返されるテーブル

列名

データ型

説明

dbid

smallint

データベース ID。 アドホック SQL ステートメントおよび準備された SQL ステートメントの場合、ステートメントがコンパイルされたデータベースの ID。

objectid

int

データベース オブジェクトの ID。 アドホック SQL ステートメントの場合は NULL になります。

number

smallint

プロシージャがグループ化されている場合、そのグループの番号。

0 = エントリはプロシージャではない

NULL = アドホック SQL ステートメント

encrypted

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.sysprocesses (Transact-SQL)

sys.dm_exec_requests (Transact-SQL)