我有一个存储过程,它从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
答案 0 :(得分:1)
鉴于您无法转储到临时表或表变量,因为基本存储过程有时可能会添加列,因此有三种方法可以执行此操作:
您可以使用OPENROWSET或OPENQUERY
您可以使用SQLCLR创建执行该过程的table-valued function,返回您想要的字段的结构,这将是您从SqlDataReader读取或“获取”的唯一字段
您可以使用SQLCLR创建stored procedure来执行获取SqlDataReader
的过程,而不是将SqlDataReader返回到SqlContext.Pipe.Send()
,您将使用{{3} },SendResultsStart和SendResultsRow。您将创建一个仅包含所需字段的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