9

ストアド プロシージャの汎用ログを実装しようとしています。私が見つけた最善の解決策は、DBCC INPUTBUFFER を使用することです。次のようなプロシージャ コールのテキストが返されます。

DECLARE @a INT
SET @a = 1000
EXEC usp_Test @param = @a

ただし、1 つの制限があります。このバッファーの最大長は 4000 です。テーブル値パラメーターを持つ多くのプロシージャーがあり、多くの場合、10000 を超えるレコードが含まれているため、このアプローチではこの呼び出しをログに記録できません。

各プロシージャで「プロシージャ呼び出しのテキスト」を手動で作成せずに、このようなログを実装する方法はありますか?

4

2 に答える 2

4

を使用する代わりに、 dm_exec_sql_textDBCC INPUTBUFFER @SPIDを使用してみることができます

最後のSPのnvarchar(max)時点でフィールドがあります。Text

このコードの関数を作成してみてください(@SPIDas intパラメーターを期待してください)。

--Select the sql_handle first for the given session ID
DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = @SPID

--Select the last statement
SELECT TEXT
FROM sys.dm_exec_sql_text(@sqltext)

別の使用方法:

EXEC yourProcedure withYourParams
SELECT @sqltext = sql_handle FROM sys.sysprocesses WHERE spid = @@SPID

SELECT TEXT FROM ::fn_get_sql(@sqltext)

このためのパラメーターの代わりに@SPID、を使用できます @@SPIDが、このコードセグメントは最後のSP呼び出しと統合されます。

于 2012-12-04T13:59:59.597 に答える
0

変更データ キャプチャはどうですか?

http://msdn.microsoft.com/en-us/library/bb510744(v=sql.105).aspx

または OUTPUT ステートメント

http://msdn.microsoft.com/en-us/library/ms177564.aspx

于 2012-12-12T04:56:26.337 に答える