我想知道是否可以使用另一个存储过程检索存储过程的结果。
我有以下作为测试示例
第一个存储过程旨在返回两个值
if(object_id('sp_function01')) is not null
drop procedure sp_function01
go
create procedure sp_function01
as
declare @lv_res01 char(20)
declare @lv_res02 char(20)
set @lv_res01 = 'fn01 result 01'
set @lv_res02 = 'fn01 result 02'
select @lv_res01, @lv_res02
go
然后第二个用于检索这些值并使用它们
if(object_id('sp_function02')) is not null
drop procedure sp_function02
go
create procedure sp_function02
as
declare @lv_var01 char(20)
declare @lv_res01 char(20)
declare @lv_res02 char(20)
set @lv_var01 = 'variable 01'
exec sp_function01
-- catch variables from this function
-- into lv_res01 and lv_res02
select @lv_var01, @lv_res01, @lv_res02
go
然而lv_res01和lv_res02的值是NULL,我不确定如何实际捕获它们
答案 0 :(得分:2)
这样的事情:
第一个程序:
create procedure sp_function01
@lv_res01 char(20) OUTPUT,
@lv_res02 char(20) OUTPUT
as
set @lv_res01 = 'fn01 result 01'
set @lv_res02 = 'fn01 result 02'
select @lv_res01, @lv_res02
go
第二个程序:
create procedure sp_function02
as
declare @lv_var01 char(20)
declare @lv_res01 char(20)
declare @lv_res02 char(20)
set @lv_var01 = 'variable 01'
exec sp_function01 @lv_res01 OUTPUT, @lv_res02 OUTPUT
-- catch variables from this function
-- into lv_res01 and lv_res02
select @lv_var01, @lv_res01, @lv_res02
go
单独调用sp_function01(它或多或少相同,你只需要声明所有输出参数并将它们传递给proc,无论是从另一个存储过程内部还是在其外部):
DECLARE @lv_res01 char(20)
DECLARE @lv_res02 char(20)
exec sp_function01 @lv_res01 OUTPUT, @lv_res02 OUTPUT
答案 1 :(得分:1)
局部变量的范围是声明它们的模块,因此函数02中的变量在函数1中不可用。您需要使用OUTPUT
参数或使用INSERT...EXEC
将function02的结果集插入临时表或表变量。
有关这些选项和其他选项的详细讨论,请参阅how to share data between stored procedures。