从存储过程中调用存储过程并返回记录集

时间:2008-10-23 16:36:18

标签: sql-server tsql

我有一个存储过程,可以回滚一系列操作。我想从另一个SP中调用它。

问题是内部SP返回一个记录集,其中包含一个指示成功程度的值。

这种方法效果很好,并且在我们的上下文中有一些优势,但回想起来,我会以传统的方式使用Return值或Output参数。

可以总是改变这个SP以使用这种方法并修改调用代码,但是a)我不想涉及任何比我更多的代码,并且b)在智力水平,我很想知道可能存在哪种替代解决方案,如果有的话。

如何(如果有的话)我可以调用此SP并确定返回的单例记录集的值?

由于

4 个答案:

答案 0 :(得分:7)

存储过程返回与任何其他记录集一样的记录集,因此您实际上可以执行此操作:

INSERT INTO MyTable(     myvalue的 )

EXEC dbo.MyStoredProcedure

EXEC取代了SELECT语句。要获取值,只需从您插入的表中选择SELECT。通常,这将是临时表。

答案 1 :(得分:1)

另一个选项是将返回记录集的存储过程转换为返回表的函数。

如果您想最小化对系统的更改,Ant的方法可能是最好的。

通常,您将使用临时表来执行该方法,因为您无法使用exec语句插入表变量。

答案 2 :(得分:1)

如果您需要将此功能用于MULTIPLE记录集,这是一个很好的变体。

CREATE TABLE #outsidetable (...)
exec spInsideProcedure
SELECT * FROM #outsidetable

在spInsideProcedure内部

INSERT INTO #outsidetable SELECT <blah blah blah>

答案 3 :(得分:0)

我尝试了Ant的方法,并采用了一种方式:

Declare @Success tinyint
Declare @Response Table (Success int)
Insert into @Response(Success)
Exec Fix_RollbackReturn 12345, 15
Select @Success=Success from @Response

正如您所看到的,我使用了表变量而不是临时表,因为它比临时表略高效。

感谢所有帮助人员。

编辑:看来Dave是对的。也就是说,我的Exec-into-Table-variable方法适用于我的SQL2005开发机器,但是当它移动到Live(SQL2000)机器时它反对,所以我不得不改为临时表方法。

这有点烦人,特别是因为在几周内我们全面升级到SQL2005(!)。