我有一个存储过程,它从 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
最佳答案
鉴于您无法转储到临时表或表变量,因为基本存储过程有时可能会添加列,因此可以通过三种方法来执行此操作:
您可以使用 OPENROWSET 从存储过程中有效地进行 SELECT或OPENQUERY
您可以使用 SQLCLR 创建 table-valued function执行该过程,返回一个仅包含您想要的字段的结构,这将是您从 SqlDataReader 读取或“获取”的唯一字段。
您可以使用 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/