2025年10月28日火曜日

SQL Server ストアドプロシージャの基本|CREATE/EXEC構文と実務サンプル

ストアドプロシージャの役割と基本構造を理解しよう

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・パフォーマンス最適化など、より高度な活用法を紹介します。

参考リンク(公式ドキュメント)

SQL Server 解説用イメージ

0 件のコメント:

コメントを投稿