TSQL存储过程检索变量

时间:2016-09-14 11:23:29

标签: sql-server tsql stored-procedures

我想知道是否可以使用另一个存储过程检索存储过程的结果。

我有以下作为测试示例

第一个存储过程旨在返回两个值

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,我不确定如何实际捕获它们

2 个答案:

答案 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