当前位置: 首页 > 面试题库 >

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

仰成天
2023-03-14
问题内容

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

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

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

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

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

有任何想法吗??

编辑:

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

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


问题答案:

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

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


 类似资料:
  • 问题内容: 我有一个Winforms应用程序和一个employeeListBox,departmentComboBox和一些文本框来显示员工信息,例如fNameTextbox,lNameTextBox ..... 我想通过departmentCombobox选定的值填充employeelistBox,并从employeeListBox中填充文本框。我具有用于选择部门员工的此存储过程 并填充列表框我

  • 问题内容: 我正在将MyBAtis-3与MyBAtis- Spring一起使用。当我尝试调用使用MyBatis批注返回多个参数的存储过程时。我什么也没得到,我可以看到输入参数已传递到日志中的SP,并且挂在那里,没有进度,也没有抛出异常。 PFB我试图从MyBAtis访问的Oracle存储过程, PFB映射器接口方法, Test对象包含在存储过程调用语句中作为输入传递的参数。 当我执行此操作时,它会

  • 我正在开发一个框架,其中我是一个使用动态创建的参数调用存储过程。我正在运行时构建参数集合。 当我将参数传递给存储过程时,会出现此问题,但存储过程不接受此类参数。 例如,我的存储过程是: 调用存储过程: 这会引发以下错误: 这在 Sybase ASE 中工作正常,它只是忽略任何其他参数。这可以通过MSSQL服务器2008实现吗?任何帮助,非常感谢。谢谢

  • 在我的应用程序中,我想执行像SELECT*FROM tbl这样的查询,其中,@list中的col In(@list)可以有变量no of值。我正在使用MS SQL server数据库。当我搜索这个问题时,我找到了这个链接 http://www.sommarskog.se/arrays-in-sql-2008.html 此链接表示使用表值参数。因此,我使用Microsoft SQL Server M

  • 问题内容: 我有许多使用CTE,临时表,表变量和子查询的存储过程,我需要获取该存储过程中使用的所有列(包括数据库,架构和表/视图)的列表。我不需要获取临时表,表变量或CTE中的列。我只需要在服务器上的数据库的表或视图中定义的引用列。 我试过了,但是在第一个选择查询后或在CTE中选择后,它们不返回列。 问题答案: 当执行存储过程时,它将被解析并编译成查询计划,将对其进行缓存,您可以通过sys.dm_

  • 我刚开始使用firebase作为我的Flatter应用程序的后端,我有一个问题:如何将两个文档链接在一起,同时获取这两个数据。例如,我有一个用户集合和一个帖子集合。我如何链接这两个文档,当我获取帖子数据时,我也会在相同的响应中获取用户数据