存储过程获取参数列表和当前值

时间:2013-03-04 12:44:17

标签: sql tsql sql-server-2005

不确定如何实现这一点,但我需要一种方法来获取存储过程的当前参数列表以及它们传入的值(此代码将在存储过程本身中执行)。

我知道我可以使用sys.parameters来获取参数名称,但是如何获取实际值?

我需要做的是创建一个形式为

的字符串
@param_name1=@value1,@param_name2=@value2,...,@param_namen=@valuen

我曾尝试使用动态sql,但对此并不高兴。

任何想法??

编辑:

目前我只是逐个浏览所有参数来构建字符串。但是我想要一个“更好”的方法,因为有很多参数。稍后会添加incase参数(但生成字符串的代码不会更新)。

我尝试使用动态sql但放弃了,因为sp_executesql sp需要将参数传递给它...

2 个答案:

答案 0 :(得分:3)

你说'(这段代码将在存储过程中执行)。所以假设您在程序中,您将已经知道参数名称,因为您必须在创建过程时声明它们。只需选择并将名称放在文本字段

ALTER PROCEDURE procname
(
     @param1 NVARCHAR(255)
    ,@param2 INT
    ...
)

SELECT [Parameters] = '@param1=' + @param1 
                    + ',@param2=' + CONVERT(NVARCHAR(MAX),@param2)...

{-1}}是非char数据类型的示例。


更新

您需要创建一个指向自身的链接服务器以使用CONVERT函数。

OPENQUERY

现在你可以做这样的游标来获取每个参数名称,然后在USE [master] GO /****** Object: LinkedServer [.] Script Date: 04/03/2013 16:22:13 ******/ EXEC master.dbo.sp_addlinkedserver @server = N'.', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'.', @provstr=N'Integrated Security=SSPI' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'.',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL GO 中使用动态sql来获取值:

OPENQUERY

答案 1 :(得分:0)

从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包装的东西。我用它来记录捕获块中的错误。