动态获取存储过程中的所有参数值

时间:2016-01-28 18:44:39

标签: sql tsql stored-procedures

有没有办法动态地从存储过程中获取所有参数?这意味着在一个存储过程中迭代所有参数以将其值转换为一个字符串。原因是为一堆存储过程统一了日志记录过程。

到目前为止,我试图从SP获取参数名称。

SELECT PARAMETER_NAME 
FROM INFORMATION_SCHEMA.PARAMETER
WHERE SPECIFIC_NAME = 'procedure_name';

另外,我尝试使用动态SQL命令。我用include参数生成了命令,但EXEC无法执行命令。

@cmd = 'SELECT '@UserID' + CONVERT(NVARCHAR(MAX), @UserID) 
             + '@Date' + CONVERT(NVARCHAR(MAX), @Date)'
EXEC @cmd

那么,除了手动生成参数列表之外,还有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:0)

自SQL Server 2014起,sys.dm_exec_input_buffer是一个表值函数,其输出列event_info给出完整的执行语句(包括参数)。

我用它来记录存储过程中的错误。

例如:

--include this inside the stored procedure
declare @statement nvarchar(max)
select  @statement = event_info 
from    sys.dm_exec_input_buffer(@@spid, current_request_id())

--this will print whatever you called the procedure with (including parameters)
print @statement

-- if you want to parse just the parameters from the statement, it can be done like this
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)

select  @params