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

how to pass parameter that I get from one Stored Procedure to another Stored Procedure?

我需要执行存储过程,他的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    

不确定为什么对这个问题投了反对票。英语可能有点弱,但是存储过程参数很晦涩。

您必须将过程和 EXEC 定义为传递参数和期望输出。存储过程可以包含一个 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

根据您的 post,考虑到您的第二个过程 SECOND_SP 需要 @ID 参数并且您希望将第二个过程的 return 值赋给 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;

正如 Gordon 在评论中所写,您可以在第二个存储过程中使用 output 参数。另一种选择是使用 rahul's (如果第二个存储过程只是 returns 一个标量值)

这是一个简单的例子:

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    

如果您无法将 SECOND_SP 更新为 return 作为 OUTPUT 参数的值,并且该存储过程 return 是一行,您可以将其插入到临时 Table(即 #Table)或一个 Table 变量(即 @Table),然后从 table 中获取值。大致如下:

DECLARE @TempProcResult TABLE (ID INT, OtherField VARCHAR(50));

INSERT INTO @TempProcResult (ID, OtherField)
  EXEC SECOND_SP @ID;

INSERT INTO dbo.abc (Id, TypeString)
  SELECT tmp.ID, @TypeString
  FROM   @TempProcResult tmp;