我有一个存储过程,可以回滚一系列操作。我想从另一个SP中调用它。
问题是内部SP返回一个记录集,其中包含一个指示成功程度的值。
这种方法效果很好,并且在我们的上下文中有一些优势,但回想起来,我会以传统的方式使用Return值或Output参数。
我可以总是改变这个SP以使用这种方法并修改调用代码,但是a)我不想涉及任何比我更多的代码,并且b)在智力水平,我很想知道可能存在哪种替代解决方案,如果有的话。
如何(如果有的话)我可以调用此SP并确定返回的单例记录集的值?
由于
答案 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(!)。