小编典典

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

sql

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

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

我需要做的是制作一个格式为char的字符串

@param_name1=@value1,@param_name2=@value2,...,@param_namen=@valuen

我曾尝试使用动态sql,但对此并不太满意。

有任何想法吗??

编辑:

目前,我只是一个接一个地遍历所有参数来构建字符串。但是,我想要一种“更好”的方法,因为有很多参数。并在以后添加参数的情况下(但不会更新用于生成字符串的代码)。

我尝试使用动态sql,但由于sp_executesqlsp需要将参数传递给它而放弃了…


阅读 219

收藏
2021-04-28

共1个答案

小编典典

您声明“(此代码将在存储过程本身中执行)。”
因此,假设您已在过程中,那么您将已经知道参数名称,因为在创建过程时必须声明它们。只需进行选择,然后将名称放在文本字段中

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

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

CONVERT是有作为非char数据类型的示例。


更新

您将需要创建一个指向自身的链接服务器才能使用该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获取值:

DECLARE curParms CURSOR FOR
SELECT
    name
FROM sys.parameters
WHERE OBJECT_ID = OBJECT_ID('schema.procedurename')
ORDER BY parameter_id
OPEN curParms
FETCH curParms INTO @parmName
WHILE @@FETCH_STATUS <> -1
BEGIN
    SELECT @parmName + '=' + (SELECT * FROM OPENQUERY('linkedservername','SELECT ' + @parmName))
    FETCH curParms INTO @parmName
END
CLOSE curParms
DEALLOCATE curParms
2021-04-28