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

时间:2014-09-30 04:28:11

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

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

Ex:原始存储过程:

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

2 个答案:

答案 0 :(得分:1)

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

  1. 您可以使用OPENROWSETOPENQUERY

  2. 从存储过程中有效地进行选择
  3. 您可以使用SQLCLR创建执行该过程的table-valued function,返回您想要的字段的结构,这将是您从SqlDataReader读取或“获取”的唯一字段

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

答案 1 :(得分:1)

您不需要为此创建新的存储过程,可以使用OpenQuery在简单查询中集成存储的proc调用,也可以使用临时表。

使用OPENQUERY

SELECT  Name,
        Address  
FROM    OPENQUERY(ServerName, 'EXEC myBaseProcedure 19')
-- WHERE   your_field = expected_value --> if you need to add filters

使用临时表

Declare @MyTempTable Table (columns definitions)

Insert @MyTempTable Exec myBaseProcedure 19 

Select Name,
       Address  
FROM   @MyTempTable