不确定如何实现这一点,但我需要一种方法来获取存储过程的当前参数列表以及它们传入的值(此代码将在存储过程本身中执行)。
我知道我可以使用sys.parameters
来获取参数名称,但是如何获取实际值?
我需要做的是创建一个形式为
的字符串@param_name1=@value1,@param_name2=@value2,...,@param_namen=@valuen
我曾尝试使用动态sql,但对此并不高兴。
任何想法??
编辑:
目前我只是逐个浏览所有参数来构建字符串。但是我想要一个“更好”的方法,因为有很多参数。稍后会添加incase参数(但生成字符串的代码不会更新)。
我尝试使用动态sql但放弃了,因为sp_executesql
sp需要将参数传递给它...
答案 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包装的东西。我用它来记录捕获块中的错误。