ストアドプロシージャの役割と基本構造を理解しよう
SQL Serverで繰り返し実行する処理を効率化する仕組みが、ストアドプロシージャ(Stored Procedure)です。
あらかじめ定義したSQLのまとまりをサーバーに保存し、呼び出すだけで実行できるため、アプリケーションや運用ジョブからの再利用が容易になります。
この記事では、CREATE PROCEDURE/EXECUTE構文から始まり、パラメータ、戻り値、実行管理までを順に解説します。
目次
基本構文(CREATE PROCEDURE/EXECUTE)
まずは、ストアドプロシージャの最小構文を見てみましょう。
SQL Serverでは「CREATE PROCEDURE」で定義し、「EXEC」または「EXECUTE」で実行します。
-- 最も基本的な構文
CREATE PROCEDURE dbo.Sample_Procedure
AS
BEGIN
SELECT 'Hello, Stored Procedure!' AS Message;
END;
GO
-- 実行
EXEC dbo.Sample_Procedure;
この例では、SQL文を1つの手続きとして登録しています。
プロシージャはSQL Server内部でプリコンパイルされ、実行速度が向上する点もメリットです。
次に、引数(パラメータ)付きの構文を見てみましょう。
CREATE PROCEDURE dbo.GetEmployeeByDept
@DepartmentID INT
AS
BEGIN
SELECT EmployeeID, Name, DepartmentID
FROM dbo.Employee
WHERE DepartmentID = @DepartmentID;
END;
GO
EXEC dbo.GetEmployeeByDept @DepartmentID = 5;
引数は「@」で始まり、呼び出し時に指定します。
また、デフォルト値を設定すれば省略実行も可能です。
CREATE PROCEDURE dbo.GetOrders
@Year INT = 2024
AS
BEGIN
SELECT * FROM dbo.Orders
WHERE YEAR(OrderDate) = @Year;
END;
GO
定義を変更するには ALTER、削除するには DROP を使用します。
ALTER PROCEDURE dbo.GetOrders
AS
BEGIN
SELECT TOP 10 * FROM dbo.Orders ORDER BY OrderDate DESC;
END;
GO
DROP PROCEDURE dbo.GetOrders;
GO
最後に、RETURNを使って値を返すサンプルです。
CREATE PROCEDURE dbo.GetRecordCount
AS
BEGIN
DECLARE @Count INT;
SELECT @Count = COUNT(*) FROM dbo.Employee;
RETURN @Count;
END;
GO
DECLARE @Result INT;
EXEC @Result = dbo.GetRecordCount;
PRINT @Result;
ストアドプロシージャとは
ストアドプロシージャは、SQL文を1つのまとまりとして保存・管理できる仕組みです。
利点は以下の通りです。
- パフォーマンス:一度コンパイルされるため、再実行が高速。
- 再利用性:複数のアプリやスクリプトから共通呼び出しが可能。
- セキュリティ:権限管理が容易で、SQLインジェクション対策にも有効。
- 保守性:変更をサーバー側で一元管理できる。
ストアドプロシージャは「ビジネスロジックをデータベース層で標準化する」ことに大きな価値があります。
パラメータと戻り値の使い方
プロシージャには引数(パラメータ)や戻り値を定義できます。
入力用の INパラメータ、呼び出し元に値を返す OUTPUTパラメータ があります。
CREATE PROCEDURE dbo.GetSalesSummary
@Year INT,
@TotalAmount DECIMAL(18,2) OUTPUT
AS
BEGIN
SELECT @TotalAmount = SUM(Amount)
FROM dbo.Sales
WHERE YEAR(OrderDate) = @Year;
END;
GO
DECLARE @Result DECIMAL(18,2);
EXEC dbo.GetSalesSummary @Year = 2024, @TotalAmount = @Result OUTPUT;
PRINT @Result;
RETURNは整数値専用で、成功コードや件数返却などに利用されます。
一方、複数値を返す場合はOUTPUTパラメータの方が柔軟です。
実行方法と管理(sp_helptext/sys.procedures)
プロシージャの中身を確認したい場合は、以下のシステムプロシージャを使用します。
EXEC sp_helptext 'dbo.GetSalesSummary';
さらに、メタ情報はシステムビューからも取得できます。
SELECT name, create_date, modify_date
FROM sys.procedures
WHERE type = 'P';
実行権限は次のように付与できます。
GRANT EXECUTE ON dbo.GetSalesSummary TO SalesUser;
依存関係を調べたい場合は、sys.sql_expression_dependenciesを使うと便利です。
実務で使えるプロシージャ例
ここでは実際の業務シナリオを想定した例を紹介します。
① 売上データ集計用のプロシージャ
CREATE PROCEDURE dbo.GetMonthlySales
@TargetMonth CHAR(7)
AS
BEGIN
SELECT
FORMAT(OrderDate, 'yyyy-MM') AS Month,
SUM(Amount) AS TotalSales
FROM dbo.Sales
WHERE FORMAT(OrderDate, 'yyyy-MM') = @TargetMonth
GROUP BY FORMAT(OrderDate, 'yyyy-MM');
END;
GO
② INSERT処理+エラーハンドリング例
CREATE PROCEDURE dbo.AddCustomer
@Name NVARCHAR(50),
@Email NVARCHAR(100)
AS
BEGIN
BEGIN TRY
INSERT INTO dbo.Customer(Name, Email)
VALUES(@Name, @Email);
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
END CATCH
END;
GO
③ 条件分岐を含む更新処理例
CREATE PROCEDURE dbo.UpdateOrderStatus
@OrderID INT,
@NewStatus NVARCHAR(20)
AS
BEGIN
IF @NewStatus IN ('Completed', 'Cancelled')
UPDATE dbo.Orders SET Status = @NewStatus WHERE OrderID = @OrderID;
ELSE
PRINT 'Invalid Status Value.';
END;
GO
開発・運用で注意すべきポイント
- sp_プレフィックスを避ける:システムDBを優先検索するため遅延の原因。
- ALTERよりDROP+CREATE:変更が多い場合は再作成の方が安全。
- キャッシュ再利用:パラメータスニッフィングに注意(応用編で詳説)。
- ソース管理:Git等で定義SQLをバージョン管理する。
- 権限設計:GRANT EXECUTEで最小権限運用。
まとめ:プロシージャでSQLを標準化しよう
ストアドプロシージャは、SQL Serverにおける処理の標準化と再利用の核となる機能です。
業務ロジックをサーバー側に集約することで、パフォーマンス・保守性・セキュリティがすべて向上します。
この記事で紹介した基本構文を理解すれば、実務でのSQL自動化や効率化の基盤を築けるでしょう。
次回の応用編では、トランザクション制御・動的SQL・パフォーマンス最適化など、より高度な活用法を紹介します。
参考リンク(公式ドキュメント)

0 件のコメント:
コメントを投稿