sql - 是否可以从存储过程中检索选定的列?

标签 sql sql-server sql-server-2008-r2

我有一个存储过程,它从 SELECT 返回几列。现在我需要从新存储过程中的这些列中获取 2 列并使用它们。我正在尝试使用 EXEC 方法来执行此操作。可以这样做吗?

例如:原始存储过程:

CREATE PROCEDURE myBaseProcedure
   @stId INT
AS 
BEGIN
 SELECT Name,
        Address,
        StudentId,
        Grade
 FROM Student
 WHERE StudentId = @stId    

END

新存储过程:

CREATE PROCEDURE myNextProcedure
BEGIN
    EXEC myBaseProcedure 19 -- Here I need to grab only StudentId and Name??
END

最佳答案

鉴于您无法转储到临时表或表变量,因为基本存储过程有时可能会添加列,因此可以通过三种方法来执行此操作:

  1. 您可以使用 OPENROWSET 从存储过程中有效地进行 SELECT或OPENQUERY

  2. 您可以使用 SQLCLR 创建 table-valued function执行该过程,返回一个仅包含您想要的字段的结构,这将是您从 SqlDataReader 读取或“获取”的唯一字段。

  3. 您可以使用 SQLCLR 创建 stored procedure执行过程以获取 SqlDataReader,而不是将 SqlDataReader 返回到 SqlContext.Pipe.Send(),您可以使用 SendResultsStart , SendResultsRow ,和SendResultsEnd 。您将创建一个仅包含您想要的字段的 SqlDataRecord,并且这些字段也将是您从 SqlDataReader 读取或“获取”的唯一字段。虽然这仍然留给您一个存储过程,但字段的过滤是在基于 CLR 的过程中完成的,因此无论基本存储过程的结果集结构如何变化,都保证输出正是您想要的字段。通过这种方式,您可以创建一个本地临时表来转储结果,这对于连接到其他表来说会更好。此方法还允许您将字段列表传递到基于 CLR 的存储过程,该存储过程将被解析并用作动态构造 SqlDataRecord 的字段以及动态确定哪些字段从SqlDataReader获取。这会有点复杂,但也更灵活:)。

关于sql - 是否可以从存储过程中检索选定的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26112797/

相关文章:

sql - 在 SQL Server 中查询对话中用户的精确匹配

c# - 将 Windows 身份验证集成到 SQL Server

sql-server-2008-r2 - 无法从 CTE 中删除 - MSG 4405

sql - 插入数据时使用 Rowlock 有帮助......?

sql - 无法将 postgresql 表列从类型 varchar 转换为 int

sql - 多案例结果与分组依据

sql - SELECT 语句中 NOLOCK 提示的效果

sql-server - 用varchar(max)慢 "Select"查询

mysql - SQL 将值拆分为多行

mysql - 什么是正确的 MySql FULL JOIN 语法?