从 SQL Server 2014 开始sys.dm_exec_input_buffer
,它是一个表值函数,带有一个输出列event_info
,提供完整的执行语句(包括参数)。
我们可以从中解析参数值sys.dm_exec_input_buffer
并从中获取参数名称sys.parameters
并将它们连接在一起以获得您想要的字符串。
例如:
create procedure [dbo].[get_proc_params_demo]
(
@number1 int,
@string1 varchar(50),
@calendar datetime,
@number2 int,
@string2 nvarchar(max)
)
as
begin
-- get the full execution statement
declare @statement nvarchar(max)
select @statement = event_info
from sys.dm_exec_input_buffer(@@spid, current_request_id())
-- parse param values from the statement
declare @proc_name varchar(128) = object_name(@@procid)
declare @param_idx int = charindex(@proc_name, @statement) + len(@proc_name)
declare @param_len int = len(@statement) - @param_idx
declare @params nvarchar(max) = right(@statement, @param_len)
-- create param values table
select value, row_number() over (order by current_timestamp) seq
into #params
from string_split(@params, ',')
-- get final string
declare @final nvarchar(max)
select @final = isnull(@final + ',','') + p1.name + '=' + ltrim(p2.value)
from sys.parameters p1
left join #params p2 on p2.seq = parameter_id
where object_id = @@procid
select @final params
end
要测试它:
exec get_proc_params_demo 42, 'is the answer', '2019-06-19', 123456789, 'another string'
返回你想要的字符串:
@number1=42,@string1='is the answer',@calendar='2019-06-19',@number2=123456789,@string2='another string'
我有类似的东西包装成 UDF。我用它来记录 catch 块中的错误。