sys.fn_get_sql (Transact-SQL)
指定した 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 ステートメントおよび準備された 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)