如何将从一个存储过程获取的参数传递给另一个存储过程?
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;
我需要执行存储过程,他的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
这是一个简单的例子:
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;