9

我正在尝试为我的存储过程实现通用日志记录。我发现的最佳解决方案是使用 DBCC INPUTBUFFER,它返回过程调用的文本,如:

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

但它有一个限制,这个缓冲区的最大长度是 4000。我有很多具有表值参数的过程,而且它们通常包含 > 10000 条记录,所以我不能用这种方法记录这个调用。

有没有办法在每个过程中不手动创建“过程调用文本”的情况下实现这种日志记录?

4

2 回答 2

4

DBCC INPUTBUFFER @SPID您可以尝试使用dm_exec_sql_text而不是using

它有一个nvarchar(max)截至Text最后一个 SP 的字段。

尝试为此代码构建一个函数(期望@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 回答