【发布时间】:2014-03-07 14:25:59
【问题描述】:
我面临需要在另一个存储过程中使用一个存储过程的结果的情况。我的第一个存储过程返回一个表的子集,我想在第二个存储过程中使用它。
exec dbo.myprcedure param 返回结果,但我需要在另一个存储过程中捕获它。
任何帮助将不胜感激。
【问题讨论】:
标签: sql-server stored-procedures
我面临需要在另一个存储过程中使用一个存储过程的结果的情况。我的第一个存储过程返回一个表的子集,我想在第二个存储过程中使用它。
exec dbo.myprcedure param 返回结果,但我需要在另一个存储过程中捕获它。
任何帮助将不胜感激。
【问题讨论】:
标签: sql-server stored-procedures
您可以使用视图代替存储过程。视图可以包含表中选定的数据。首先创建一个视图,然后在存储过程中调用视图
或
创建一个临时表。从临时表可以得到数据的
【讨论】:
如果它只返回一个结果集,你可以创建一个临时表然后使用语法
INSERT INTO #tmp
EXEC dbo.myprocedure @param
见https://stackoverflow.com/a/14623262/8479
但总的来说,最好找到不同的方法,例如使用table-valued variables 或使用函数而不是proc。
【讨论】:
在第二个存储过程中执行第一个存储过程并在那里使用结果。像
CREATE PROCEDURE Proc_2
@param
AS
BEGIN
SET NOCOUNT ON;
/* Create a Temp Table here say #TempTable*/
INSERT INTO #TempTable
exec dbo.myporcedure @param
/* Your rest of the code that needs to work with the result set of dbo.myporcedure */
END
【讨论】:
只需在 FUNCTION 或 STORED PROCEDURE 中返回 TABLE VARIABLE,然后在调用方存储过程中使用该 TABLE VARIABLE 进行进一步处理或作为 TABLE VARIABLE 参数传递给另一个存储过程。
即如下创建一个返回 TABLE VARIABLE 的函数。
CREATE PROCEDURE MyProcedureThatReturnsATable()
RETURNS @ReturnTable TABLE
(
-- specify columns returned by the proc here
ID INT NOT NULL,
Name nvarchar(255) NOT NULL
)
AS
BEGIN
.
..
...
--This select returns data
INSERT INTO @ReturnTable
SELECT ID, Name FROM SOME_TABLES
RETURN
END
然后在父存储过程中,您将执行上述存储过程并在该父存储过程中填充一个表变量,如下所示。
DECLARE @MyParentTableVariable as TABLE (ID INT, Name nvarchar(255))
INSERT INTO @MyParentTableVariable
EXECUTE MyProcedureThatReturnsATable
因此,现在,在父存储过程中,您将来自 MyProcedureThatReturnsATable 的数据保存在 TABLE VARIABLE 中。
【讨论】: