その他の方法:sp_executesql、xp_call、CLR ストアドプロシージャ
SQL Server でストアドプロシージャ内でストアドプロシージャを実行する
SQL Server のストアドプロシージャは、複雑な処理をカプセル化し、コードの再利用性を高めるための強力なツールです。さらに、ストアドプロシージャ内で別のストアドプロシージャを実行することで、処理をさらにモジュール化し、コードの可読性と保守性を向上させることができます。
方法
ストアドプロシージャ内で別のストアドプロシージャを実行するには、以下の2つの方法があります。
EXECUTE ステートメントを使用する
EXEC [schema_name].[stored_procedure_name] [@parameter1, @parameter2, ...]
schema_name
: 呼び出すストアドプロシージャのスキーマ名stored_procedure_name
: 呼び出すストアドプロシージャの名前@parameter1, @parameter2, ...
: 呼び出すストアドプロシージャのパラメータ
例
CREATE PROCEDURE [dbo].[MyStoredProcedure]
AS
BEGIN
EXEC [dbo].[AnotherStoredProcedure] @param1, @param2
END
GO
CREATE PROCEDURE [dbo].[AnotherStoredProcedure]
@param1 INT,
@param2 VARCHAR(50)
AS
BEGIN
-- 処理
END
GO
CALL [schema_name].[stored_procedure_name]([@parameter1], [@parameter2], ...)
CREATE PROCEDURE [dbo].[MyStoredProcedure]
AS
BEGIN
CALL [dbo].[AnotherStoredProcedure](@param1, @param2)
END
GO
CREATE PROCEDURE [dbo].[AnotherStoredProcedure]
@param1 INT,
@param2 VARCHAR(50)
AS
BEGIN
-- 処理
END
GO
注意事項
- 呼び出すストアドプロシージャが存在する必要があります。
- パラメータの名前とデータ型は、呼び出すストアドプロシージャの定義と一致する必要があります。
- 呼び出すストアドプロシージャは、
RETURN
ステートメントを使用して値を返すことができます。
USE AdventureWorks2019
CREATE PROCEDURE [dbo].[GetCustomerOrders]
@CustomerID INT
AS
BEGIN
EXEC [dbo].[GetOrdersByCustomer] @CustomerID
END
GO
CREATE PROCEDURE [dbo].[GetOrdersByCustomer]
@CustomerID INT
AS
BEGIN
SELECT *
FROM Sales.Orders
WHERE CustomerID = @CustomerID
END
GO
EXEC [dbo].[GetCustomerOrders] 10249
USE AdventureWorks2019
CREATE PROCEDURE [dbo].[GetCustomerOrders]
@CustomerID INT
AS
BEGIN
CALL [dbo].[GetOrdersByCustomer](@CustomerID)
END
GO
CREATE PROCEDURE [dbo].[GetOrdersByCustomer]
@CustomerID INT
AS
BEGIN
SELECT *
FROM Sales.Orders
WHERE CustomerID = @CustomerID
END
GO
EXEC [dbo].[GetCustomerOrders] 10249
解説
上記の例では、GetCustomerOrders
というストアドプロシージャを作成しています。このストアドプロシージャは、CustomerID
を入力パラメータとして受け取り、その顧客の注文情報を取得します。
GetCustomerOrders
ストアドプロシージャは、EXECUTE
または CALL
ステートメントを使用して GetOrdersByCustomer
という別のストアドプロシージャを実行します。GetOrdersByCustomer
ストアドプロシージャは、CustomerID
をパラメータとして受け取り、その顧客の注文情報を Sales.Orders
テーブルから取得します。
実行結果
上記の例を実行すると、GetCustomerOrders
ストアドプロシージャは、GetOrdersByCustomer
ストアドプロシージャから返された結果セットを返します。結果セットには、指定された顧客の注文情報が含まれます。
応用
- 複雑な処理を複数のストアドプロシージャに分割して、コードの可読性と保守性を向上させることができます。
- 共通の処理を複数のストアドプロシージャで再利用することで、コードの冗長性を削減することができます。
- モジュール化されたコードを使用して、複雑な処理をより簡単に管理することができます。
ストアドプロシージャ内でストアドプロシージャを実行する他の方法
sp_executesql
ステートメントは、動的に Transact-SQL ステートメントを実行するために使用できます。このステートメントを使用して、ストアドプロシージャの名前とパラメータを動的に指定することができます。
USE AdventureWorks2019
DECLARE @procName VARCHAR(50)
DECLARE @param1 INT
SET @procName = 'GetOrdersByCustomer'
SET @param1 = 10249
EXEC sp_executesql @procName, N'@CustomerID INT', @param1
xp_call
ステートメントは、拡張ストアドプロシージャを実行するために使用できます。このステートメントを使用して、DLL ファイルにあるストアドプロシージャを実行することができます。
USE AdventureWorks2019
EXEC xp_call 'MyDll', 'GetOrdersByCustomer', @CustomerID
CLR ストアドプロシージャは、.NET Framework で記述されたストアドプロシージャです。CLR ストアドプロシージャを使用して、.NET Framework のすべての機能にアクセスすることができます。
USE AdventureWorks2019
CREATE ASSEMBLY MyAssembly
FROM 'C:\MyAssembly.dll'
CREATE PROCEDURE [dbo].[GetOrdersByCustomer]
@CustomerID INT
AS
BEGIN
EXEC MyAssembly.MyClass.GetOrdersByCustomer(@CustomerID)
END
GO
上記の方法は、それぞれ異なる利点と欠点があります。どの方法を使用するかは、要件によって異なります。
sp_executesql
ステートメントは、動的に Transact-SQL ステートメントを実行できるため、柔軟性がありますが、パフォーマンスの問題が発生する可能性があります。xp_call
ステートメントは、拡張ストアドプロシージャを実行できるため、機能が豊富ですが、セキュリティ上のリスクがあります。CLR
ストアドプロシージャは、.NET Framework のすべての機能にアクセスできるため、強力ですが、開発と管理が複雑になります。
sql sql-server t-sql