2008-10-23 145 views
2

我有一个存储过程,回滚一系列操作。我想从另一个SP中调用它。调用存储过程中的存储过程并返回记录集

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

这种方法运行良好,在我们的上下文中有一些优点,但回想起来,我会用传统的方法来完成它的返回值或输出参数。

可能总是改变这个SP使用这种方法,并修改调用代码,但a)我不想涉足任何更多的代码比我必须,和b)在智力水平,我我很好奇,看看有什么替代解决方案,如果有的话。

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

感谢

回答

7

存储过程返回设置像任何其他的记录,这样你就可以真正做到这一点:

INSERT INTO MyTable的( myvalue的 )

EXEC dbo.MyStoredProcedure

EXEC代替SELECT语句。要获取该值,只需从插入的表中选择SELECT。通常情况下,这将是一个临时表。

+0

您也可以插入临时表(不是内存表)。换句话说,你可以插入到#MyTempTable中,而不是@MyOtherTempTable。 – 2008-10-23 17:03:26

1

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

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

通常情况下,您将使用该方法的临时表,因为您无法使用exec语句插入到表变量中。

1

这是一个变化,如果你需要将它用于MULTIPLE记录集的话,它将很好地工作。

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

内spInsideProcedure

INSERT INTO #outsidetable SELECT <blah blah blah> 
0

我试图Ant的方法和它的工作一种享受:

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

正如你可以看到我用了一个表变量,而不是一个临时表,因为稍比临时表高效。

感谢您的帮助。

编辑:看来,戴夫是最后的权利。也就是说,我在SQL2005开发机器上使用了Exec-into-Table-variable方法,但是当它移动到它所反对的Live(SQL2000)机器时,我不得不改用临时表方法。

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