如何将我从一个存储过程获取的参数传递给另一个存储过程?

时间:2015-06-07 13:45:59

标签: sql sql-server stored-procedures

我需要执行存储过程,他的ID将是另一个存储过程的执行。我怎么能这样做?

ALTER PROCEDURE [dbo].[spABC]       
       @ID INT
      ,@TypeString nvarchar(50)

AS 
BEGIN 
    --exec SECOND_SP

    INSERT INTO dbo.abc (Id, TypeString)  
    VALUES (@"result from the second sp.", @TypeString)
END    

4 个答案:

答案 0 :(得分:1)

不确定为什么所有人都对这个问题投了赞成票。英语可能有点弱,但存储过程参数是神秘的。

您必须将过程和EXEC定义为传递参数并期望OUTPUT。存储过程可以包含RETURN,但我很确定该值始终是INTEGER,而OP需要一个字符串。

例如:

BEGIN TRANSACTION 
GO 
CREATE PROCEDURE dbo.SECOND_SP (@ID INT, @Type VARCHAR(9) OUTPUT)
AS 
--  totally arbitrary, pretend logic for second sp for illustrative purposes
SET @Type = CASE WHEN @ID > 90000 THEN 'ADMIN' 
                 WHEN @ID > 9000 THEN     'MANAGER' ELSE 'USER' END
GO

CREATE PROCEDURE [dbo].[spABC]       
   @ID INT
AS 
BEGIN 
DECLARE @TypeString VARCHAR(9)
 exec SECOND_SP @ID, @Type = @TypeString OUTPUT

SELECT @ID, @TypeString 
--  INSERT INTO dbo.abc (Id, TypeString)   VALUES (@"result from the second sp.", @TypeString)
END    
GO
  --TEST IT .....
EXEC [dbo].[spABC]    1111
EXEC [dbo].[spABC]    9123
EXEC [dbo].[spABC]    99543

ROLLBACK 

--- RESULTS: 
1111        USER
----------- ---------
9123        MANAGER
----------- ---------
99543       ADMIN

答案 1 :(得分:1)

正如Gordon在评论中写道,你可以在第二个存储过程中有一个output参数。另一个选择是使用rahul' s example(如果第二个存储过程只返回一个标量值)

这是一个简单的例子:

CREATE PROCEDURE Second_SP
(
    @InParam varchar(10),
    @OutParam int OUTPUT -- note the OUTPUT directive
)
AS

-- do stored procedure stuff here

-- set a value to the output parameter:
SET @OutParam = 1234
GO

在第一个存储过程中,您应该在执行第二个过程时使用output指令:

ALTER PROCEDURE [dbo].[spABC]       
       @ID INT
      ,@TypeString nvarchar(50)

AS 
BEGIN 
    DECLARE @InParam varchar(10), 
            @OutParam int

    -- set parameters values before executing...

    exec SECOND_SP @InParam, @OutParam OUTPUT -- note the output directive

    INSERT INTO dbo.abc (Id, TypeString)  
    VALUES (@OutParam, @TypeString)
END    

答案 2 :(得分:1)

如果您无法更新callback(timeout=22, verbose=False) 以将值作为SECOND_SP参数返回,并且该存储过程返回单行,则可以将其插入临时表(即OUTPUT)或表变量(即#Table),然后从该表中获取值。有点像:

@Table

答案 3 :(得分:0)

根据您的帖子,考虑到您的第二个过程SECOND_SP需要@ID参数,并且您希望将第二个过程的返回值赋予INSERT语句。你可以这样做

ALTER PROCEDURE [dbo].[spABC]       
       @ID INT
      ,@TypeString nvarchar(50)

AS 
BEGIN 

    declare @var int;
    exec @var = SECOND_SP @ID;

    INSERT INTO dbo.abc (Id, TypeString)  
    VALUES (@var, @TypeString)
END   

编辑:

来自@srutzky的评论。尝试以下操作,看看是否有效

create procedure test
as
begin
return 1009;
end

declare @var int;
exec @var = test;
select @var;