T-SQL.程序调用文本

Eug*_*ene 9 t-sql sql-server logging stored-procedures

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

DECLARE @a INT
SET @a = 1000
EXEC usp_Test @param = @a
Run Code Online (Sandbox Code Playgroud)

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

有没有办法实现这样的日志记录,而无需在每个过程中手动创建"过程调用文本"?

And*_*ttó 4

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

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

尝试为此代码构建一个函数(期望 as @SPIDint 参数):

--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)
Run Code Online (Sandbox Code Playgroud)

另一种使用方法:

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

SELECT TEXT FROM ::fn_get_sql(@sqltext)
Run Code Online (Sandbox Code Playgroud)

您可以使用代替@SPID参数 @@SPID,但是此代码段将与您最后一次 SP 调用集成。