不确定如何实现,但是我需要一种方法来获取存储过程的当前参数列表以及它们的传入值(此代码将在存储过程本身中执行)。
我知道我可以sys.parameters用来获取参数名称,但是如何获取实际值呢?
sys.parameters
我需要做的是制作一个格式为char的字符串
@param_name1=@value1,@param_name2=@value2,...,@param_namen=@valuen
我曾尝试使用动态sql,但对此并不太满意。
有任何想法吗??
编辑:
目前,我只是一个接一个地遍历所有参数来构建字符串。但是,我想要一种“更好”的方法,因为有很多参数。并在以后添加参数的情况下(但不会更新用于生成字符串的代码)。
我尝试使用动态sql,但由于sp_executesqlsp需要将参数传递给它而放弃了…
sp_executesql
您声明“(此代码将在存储过程本身中执行)。” 因此,假设您已在过程中,那么您将已经知道参数名称,因为在创建过程时必须声明它们。只需进行选择,然后将名称放在文本字段中
ALTER PROCEDURE procname ( @param1 NVARCHAR(255) ,@param2 INT ... ) SELECT [Parameters] = '@param1=' + @param1 + ',@param2=' + CONVERT(NVARCHAR(MAX),@param2)...
的CONVERT是有作为非char数据类型的示例。
CONVERT
您将需要创建一个指向自身的链接服务器才能使用该OPENQUERY功能。
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