web-dev-qa-db-ja.com

SQL Serverの別のストアドプロシージャでストアドプロシージャを実行する

SQL Serverの別のストアドプロシージャでストアドプロシージャを実行するにはどうすればよいですか? 2番目の手順のパラメーターをどのように渡しますか?

33
Roys

2番目のSPによって特定の操作のみを実行し、SPから返される値を必要としない場合は、次のようにします。

Exec secondSPName  @anyparams

それ以外の場合、最初のSPによって返される値が必要な場合は、同じ数の列と、2番目のSPによって返される列の定義が同じ一時テーブル変数を作成します。次に、最初のSPでこれらの値を取得できます:

Insert into @tep_table
Exec secondSPName @anyparams

更新:

パラメーターを2番目のspに渡すには、次を実行します。

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

Exec secondSPName @id

更新2:

2番目のspがIdおよびNameを返し、idのタイプがintであり、namevarchar(64)タイプであるとします。

ここで、最初のspでこれらの値を選択する場合は、一時的なtable変数を作成して値を挿入します。

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

Select * From @tep_table

これにより、2番目のSPによって返された値が返されます。

これがあなたの疑問をすべてクリアすることを願っています。

43
Ken Clark

このようなストアドプロシージャが1つあるとします

最初のストアドプロシージャ:

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

次のように、別のストアドプロシージャからこのプロシージャを呼び出します。

2番目のストアドプロシージャ

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

上記のように、別のストアドプロシージャを呼び出すことができます

5
Sagar Hirapara

はい、次のようにできます:

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

   INSERT @Results

   EXEC Procedure2 [parameters];
   SET @total 1;

END
SELECT @total
2
Vishal Suthar

あなたの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;
...
0
alditis

ストアドプロシージャでユーザー定義関数を交互に呼び出すことができます

これにより、ストアドプロシージャを呼び出す問題が解決する場合があります

0
meer

はい、ストアプロシージャ内で関数を呼び出すのは簡単です。

例えばユーザー定義年齢関数を作成し、選択クエリで使用します。

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