我正在尝试为我的存储过程实现通用日志记录。我发现的最佳解决方案是使用 DBCC INPUTBUFFER,它返回过程调用的文本,如:
DECLARE @a INT
SET @a = 1000
EXEC usp_Test @param = @a
但它有一个限制,这个缓冲区的最大长度是 4000。我有很多具有表值参数的过程,而且它们通常包含 > 10000 条记录,所以我不能用这种方法记录这个调用。
有没有办法在每个过程中不手动创建“过程调用文本”的情况下实现这种日志记录?
我正在尝试为我的存储过程实现通用日志记录。我发现的最佳解决方案是使用 DBCC INPUTBUFFER,它返回过程调用的文本,如:
DECLARE @a INT
SET @a = 1000
EXEC usp_Test @param = @a
但它有一个限制,这个缓冲区的最大长度是 4000。我有很多具有表值参数的过程,而且它们通常包含 > 10000 条记录,所以我不能用这种方法记录这个调用。
有没有办法在每个过程中不手动创建“过程调用文本”的情况下实现这种日志记录?
DBCC INPUTBUFFER @SPID
您可以尝试使用dm_exec_sql_text而不是using
它有一个nvarchar(max)
截至Text
最后一个 SP 的字段。
尝试为此代码构建一个函数(期望@SPID
as 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 调用集成。