【问题标题】:Dynamically get all parameter values in stored procedure动态获取存储过程中的所有参数值
【发布时间】:2016-01-28 18:44:39
【问题描述】:

有没有办法从存储过程中动态获取所有参数值?

换句话说,遍历一个存储过程中的所有参数以将它们的值放入一个字符串中。这是针对一堆存储过程的统一日志记录过程。

我可以得到参数的名称:

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

另外,我尝试使用动态 SQL 命令。我已经生成了一个包含参数的命令,但是 EXEC 不能执行命令。

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

除了手动为每个存储过程生成参数值列表之外,还有其他方法吗?

【问题讨论】:

  • 即使是日志,编写存储过程的人也需要添加日志代码。
  • 存储过程已经写好了,我正在寻找容易实现的方法。在最好的情况下,一些动态的代码可以在所有 SP 中工作,而无需考虑它有多少参数。
  • 那么你的问题到底是什么?
  • @Rafael 为此编写通用代码。类似于在帖子中获取参数名称的方式。
  • 您的意思是从存储过程的代码内部?因此,您可以将“记录代码”粘贴到每个现有过程中,并将调用与 proc 可能具有或不具有的任何参数的值一起记录下来?可爱的想法。我在没有参数的情况下做了一次(只记录调用了哪些 proc 以及调用频率,以进行代码覆盖测试)。那是你要的吗?研究:herehere

标签: sql tsql stored-procedures


【解决方案1】:

自 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2017-09-18
    相关资源
    最近更新 更多