在SQL Server中的一个存储过程中执行另一个存储过程

41

如何在SQL Server中执行另一个存储过程?如何传递第二个存储过程的参数?


你打算用C#还是在服务器上作为StoredProc来完成这个任务? - MethodMan
请使用 exec 关键字。 - Matthew
我需要在服务器本身执行。 - Roys
3
可能是重复的问题... https://dev59.com/-Gox5IYBdhLWcg3w9489 - SteveC
7个回答

46

如果您只想通过第二个存储过程执行特定操作,并且不需要从存储过程返回值,则可以简单地执行:

Exec secondSPName  @anyparams

否则,如果你需要在第一个存储过程中返回第二个存储过程的值,那么请创建一个临时表变量,该变量包含与第二个存储过程返回列相同数量和定义的列。然后你可以在第一个存储过程中获取这些值:

Insert into @tep_table
Exec secondSPName @anyparams

更新:

要向第二个存储过程传递参数,请按照以下步骤操作:

Declare @id ID_Column_datatype 
Set @id=(Select id from table_1 Where yourconditions)

Exec secondSPName @id

更新2:

假设你的第二个存储过程返回IdName,其中id的类型是int,而name的类型是varchar(64)

现在,如果你想在第一个存储过程中选择这些值,则需要创建一个临时的table变量并将值插入其中:

Declare @tep_table table
(
  Id int,
  Name varchar(64)
)
Insert into @tep_table
Exec secondSP

Select * From @tep_table

这将返回第二个SP返回的值。

希望这样能清楚解决您所有疑问。


谢谢..是的,我需要在第一个存储过程中返回第二个存储过程的值。但是我需要传递的参数是第一个过程的输出结果。这可能吗?请看这个例子。SP1从table_1中选择id。是否可以将此id作为第二个存储过程的参数传递? - Roys
是的,这是可能的,但首先您需要将此ID存储到变量中,然后将其传递给第二个存储过程。请参见更新的答案。 - Ken Clark
以上步骤有效。谢谢。我如何从第一个Sp中获取第二个Sp的输出值? - Roys
这个问题已经有答案了。无论如何,请再次查看更新的答案以获取更多解释。 - Ken Clark

9
假设你有一个像这样的存储过程:
第一个存储过程:
Create  PROCEDURE LoginId
     @UserName nvarchar(200),
     @Password nvarchar(200)
AS
BEGIN
    DECLARE  @loginID  int

    SELECT @loginID = LoginId 
    FROM UserLogin 
    WHERE UserName = @UserName AND Password = @Password

    return @loginID
END

现在您想从另一个存储过程中调用此过程,如下所示

第二个存储过程

Create  PROCEDURE Emprecord
         @UserName nvarchar(200),
         @Password nvarchar(200),
         @Email nvarchar(200),
         @IsAdmin bit,
         @EmpName nvarchar(200),
         @EmpLastName nvarchar(200),
         @EmpAddress nvarchar(200),
         @EmpContactNo nvarchar(150),
         @EmpCompanyName nvarchar(200)

    AS
    BEGIN
        INSERT INTO UserLogin VALUES(@UserName,@Password,@Email,@IsAdmin)

        DECLARE @EmpLoginid int

        **exec @EmpLoginid= LoginId @UserName,@Password**

        INSERT INTO tblEmployee VALUES(@EmpName,@EmpLastName,@EmpAddress,@EmpContactNo,@EmpCompanyName,@EmpLoginid)
    END

正如您在上面看到的,我们可以从另一个存储过程调用一个存储过程。


2
您的 sp_test: 返回全名
USE [MY_DB]
GO

IF (OBJECT_ID('[dbo].[sp_test]', 'P') IS NOT NULL)
DROP PROCEDURE [dbo].sp_test;
GO

CREATE PROCEDURE [dbo].sp_test 
@name VARCHAR(20),
@last_name VARCHAR(30),
@full_name VARCHAR(50) OUTPUT
AS

SET @full_name = @name + @last_name;

GO

在你的sp_main中。
...
DECLARE @my_name VARCHAR(20);
DECLARE @my_last_name VARCHAR(30);
DECLARE @my_full_name VARCHAR(50);
...

EXEC sp_test @my_name, @my_last_name, @my_full_name OUTPUT;
...

2

是的,你可以这样做:

BEGIN
   DECLARE @Results TABLE (Tid INT PRIMARY KEY);

   INSERT @Results

   EXEC Procedure2 [parameters];
   SET @total 1;

END
SELECT @total

1

您可以在存储过程中调用用户定义的函数,这可能会解决您调用存储过程的问题。


0

是的,我们可以很容易地在存储过程中调用函数。

例如,创建用户定义的年龄函数并在选择查询中使用。

select dbo.GetRegAge(R.DateOfBirth, r.RegistrationDate) as Age,R.DateOfBirth,r.RegistrationDate from T_Registration R

0

过程示例:

Create  PROCEDURE SP_Name
     @UserName nvarchar(200),
     @Password nvarchar(200)
AS
BEGIN
    DECLARE  @loginID  int

    --Statements for this Store Proc
  --
  -- 
  --

  --execute second store procedure
  --below line calling sencond Store Procedure Exec is used for execute Store Procedure.
    **Exec SP_Name_2 @params** (if any) 


END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接