TSQL:从另一个存储过程调用存储过程并读取结果

33

我有一个以SELECT结尾并返回记录集的存储过程。我可以像这样在另一个存储过程中调用它:

EXEC procedure @param

如何获取返回的记录集?谢谢


2
听起来你的存储过程应该是一个视图:http://msdn.microsoft.com/en-us/library/aa258253%28SQL.80%29.aspx - OMG Ponies
4
为什么您会发表这样的声明?谁知道存储过程中的更新等操作正在进行什么情况... - David Cruwys
6个回答

38

您可以创建一个临时表,然后使用INSERT INTO #MyTable EXEC procedure @param

这里有一些其他技术列表


3
据我所知,你不能这样做。你可能想要的是为你的第一个(或两个)过程使用一个函数。函数只能返回一个值,但它们可以返回一个表。存储过程可以返回多个结果,但不能返回给其他函数/存储过程。
例如:
CREATE FUNCTION [dbo].[fn_GetSubordinates] (
    @sPersonID VARCHAR(10),
    @nLevels INT
)
RETURNS @tblSubordinates TABLE
(
    Person_Id VARCHAR(10),
    Surname char(25),
    Firstname char(25)
)
AS
BEGIN
    ...

2
您可以在存储过程中使用输出变量来实现此操作。例如:
CREATE PROCEDURE sp_HelloWorld   @MyReturnValue int OUT
AS
SELECT @MyReturnValue = 100
Return @MyReturnValue 

要调用这个存储过程,请按照以下步骤操作:
DECLARE @TestReturnVal int 

EXEC sp_HelloWorld @TestReturnVal output
SELECT @TestReturnVal 

2

1
我原以为 TVP 是一个仅表示输入的结构... 但 OP 似乎想要返回存储过程的输出? - iokevins

0
首先,您不能通过存储过程返回记录集。存储过程只能返回整数。
您提到了`SELECT`语句,它是一种DQL,仅用于显示目的。
解决此问题的方法是将记录集分配给全局临时表,该表也可以在外部存储过程中访问。

0

有趣的是,如果EXEC执行的存储过程中只有一个简单的SELECT(带有SET NOCOUNT ON),那么它似乎可以正常工作,但是一旦添加任何其他的T-SQL语句(IFDECLARE等),就会得到一个空行集。我可以证实这在Microsoft SQL Server 2019 (RTM-CU19) (KB5023049) - 15.0.4298.1 (X64)(在Linux容器中运行)中是这样的。

然而,最一致的方法是为您想要从中SELECT的最终结果声明一个VIEW,并从该VIEWSELECT


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接