SQLストアドプロシージャのパラメータ完全ガイド:使い方とベストプラクティス

SQLストアドプロシージャのパラメータを使うことで、効率的かつ柔軟なデータ操作が可能になります。ストアドプロシージャはデータベース内での複雑な操作を簡略化し、再利用性や保守性を向上させるための強力なツールです。この記事では、パラメータの種類、宣言方法、実践例、エラーハンドリングなど、ストアドプロシージャのパラメータに関するすべてを詳しく解説します。

目次

ストアドプロシージャの基礎

ストアドプロシージャとは、データベース内で実行される一連のSQLステートメントをまとめたもので、関数のように呼び出して使用することができます。これにより、複雑なクエリや反復的なタスクを効率的に処理でき、再利用性と保守性が向上します。ストアドプロシージャは、パフォーマンスの最適化やセキュリティの強化にも寄与します。

ストアドプロシージャの利点

ストアドプロシージャを使用する主な利点は以下の通りです:

  1. 再利用性:一度作成すれば、何度でも再利用可能です。
  2. パフォーマンス:事前にコンパイルされているため、実行速度が速くなります。
  3. セキュリティ:直接SQLクエリを実行するのではなく、プロシージャを通じて操作するため、SQLインジェクションのリスクが減ります。
  4. 保守性:ロジックを一箇所に集中させることで、メンテナンスが容易になります。

ストアドプロシージャの基本構文

以下は、SQL Serverでのストアドプロシージャの基本的な構文です:

CREATE PROCEDURE ProcedureName
AS
BEGIN
    -- SQL文をここに記述
END;

具体的な例として、従業員テーブルからデータを取得するシンプルなストアドプロシージャを作成してみましょう。

CREATE PROCEDURE GetEmployees
AS
BEGIN
    SELECT * FROM Employees;
END;

このストアドプロシージャは、実行されると従業員テーブルからすべてのレコードを取得します。

パラメータの種類と特徴

ストアドプロシージャには、複数のパラメータを使用して柔軟なデータ操作が可能です。パラメータの種類には、入力パラメータ、出力パラメータ、入力出力パラメータの3つがあります。それぞれの特徴と用途について詳しく見ていきましょう。

入力パラメータ

入力パラメータは、ストアドプロシージャに値を渡すために使用されます。呼び出し元から値を受け取り、その値を基に処理を行います。宣言には IN キーワードを使用します。

例:

CREATE PROCEDURE GetEmployeeByID
    @EmployeeID INT
AS
BEGIN
    SELECT * FROM Employees WHERE EmployeeID = @EmployeeID;
END;

この例では、@EmployeeID という入力パラメータを使用して、特定の従業員の情報を取得します。

出力パラメータ

出力パラメータは、ストアドプロシージャの実行結果を呼び出し元に返すために使用されます。宣言には OUT キーワードを使用します。

例:

CREATE PROCEDURE GetEmployeeCount
    @EmployeeCount INT OUTPUT
AS
BEGIN
    SELECT @EmployeeCount = COUNT(*) FROM Employees;
END;

この例では、@EmployeeCount という出力パラメータを使用して、従業員の数を取得し、呼び出し元に返します。

入力出力パラメータ

入力出力パラメータは、ストアドプロシージャに値を渡し、処理後に更新された値を返すために使用されます。宣言には INOUT キーワードを使用します。

例:

CREATE PROCEDURE UpdateEmployeeSalary
    @EmployeeID INT,
    @NewSalary DECIMAL(10, 2) OUTPUT
AS
BEGIN
    UPDATE Employees SET Salary = @NewSalary WHERE EmployeeID = @EmployeeID;
    SELECT @NewSalary = Salary FROM Employees WHERE EmployeeID = @EmployeeID;
END;

この例では、@NewSalary という入力出力パラメータを使用して、従業員の給与を更新し、更新後の給与を返します。

パラメータの宣言と使用方法

ストアドプロシージャでパラメータを宣言し、使用する方法について具体的な例を交えて説明します。パラメータを適切に宣言し、活用することで、ストアドプロシージャの柔軟性と再利用性が大幅に向上します。

パラメータの宣言

ストアドプロシージャ内でパラメータを宣言する際には、パラメータ名、データ型、および必要に応じて方向(入力、出力、入力出力)を指定します。

基本構文:

CREATE PROCEDURE ProcedureName
    @ParameterName DataType [IN | OUT | INOUT]
AS
BEGIN
    -- SQL文をここに記述
END;

例:

CREATE PROCEDURE GetEmployeeByName
    @EmployeeName NVARCHAR(50)
AS
BEGIN
    SELECT * FROM Employees WHERE Name = @EmployeeName;
END;

この例では、@EmployeeName というパラメータを宣言し、従業員の名前でデータを検索します。

パラメータの使用

宣言したパラメータは、ストアドプロシージャ内で通常の変数として使用できます。パラメータに値を設定し、その値を基にSQLステートメントを実行します。

例:

CREATE PROCEDURE UpdateEmployeeDepartment
    @EmployeeID INT,
    @NewDepartmentID INT
AS
BEGIN
    UPDATE Employees SET DepartmentID = @NewDepartmentID WHERE EmployeeID = @EmployeeID;
END;

このストアドプロシージャでは、@EmployeeID@NewDepartmentID の2つの入力パラメータを使用して、従業員の部署を更新します。

パラメータを使った例:データの挿入

パラメータを使用してデータを挿入する例を示します。

例:

CREATE PROCEDURE AddNewEmployee
    @EmployeeName NVARCHAR(50),
    @HireDate DATE,
    @DepartmentID INT
AS
BEGIN
    INSERT INTO Employees (Name, HireDate, DepartmentID)
    VALUES (@EmployeeName, @HireDate, @DepartmentID);
END;

このストアドプロシージャでは、新しい従業員の情報をEmployeesテーブルに挿入します。

パラメータのデータ型

ストアドプロシージャのパラメータに使用できるデータ型は多岐にわたり、適切なデータ型を選ぶことで、効率的かつ正確なデータ操作が可能になります。ここでは、主要なデータ型とその選び方について解説します。

基本的なデータ型

以下は、ストアドプロシージャでよく使用される基本的なデータ型です。

  • INT: 整数値を格納します。例:年齢、ID。
  • DECIMAL: 小数点を含む数値を格納します。例:価格、給与。
  • NVARCHAR: 可変長の文字列を格納します。例:名前、住所。
  • DATE: 日付を格納します。例:誕生日、入社日。

データ型の選び方

パラメータのデータ型を選ぶ際には、以下のポイントを考慮します。

データの性質

データの性質に応じて適切なデータ型を選びます。例えば、数量やカウントには INT 型、価格や割合には DECIMAL 型、テキスト情報には NVARCHAR 型を使用します。

ストレージの効率

データ型の選択は、ストレージの効率にも影響します。適切なサイズのデータ型を選ぶことで、ストレージの使用量を最小限に抑えることができます。例えば、短い文字列には NVARCHAR(50) のように適切な長さを指定します。

データの正確性

数値データの場合、必要な精度とスケールを考慮してデータ型を選びます。例えば、金額には DECIMAL(10, 2) のように指定することで、小数点以下2桁までの正確な数値を扱えます。

実践例:パラメータのデータ型を選ぶ

以下の例では、従業員の情報を管理するストアドプロシージャで適切なデータ型を選んでいます。

CREATE PROCEDURE AddEmployee
    @EmployeeName NVARCHAR(100),
    @BirthDate DATE,
    @Salary DECIMAL(10, 2),
    @DepartmentID INT
AS
BEGIN
    INSERT INTO Employees (Name, BirthDate, Salary, DepartmentID)
    VALUES (@EmployeeName, @BirthDate, @Salary, @DepartmentID);
END;

この例では、従業員名には NVARCHAR(100)、生年月日には DATE、給与には DECIMAL(10, 2)、部署IDには INT を使用しています。

パラメータを使った条件分岐

ストアドプロシージャでパラメータを使用して条件分岐を行うことで、柔軟で強力なクエリを作成できます。ここでは、条件分岐の基本的な方法と実例について解説します。

基本的な条件分岐

IF ステートメントを使用して、パラメータの値に基づいて異なる処理を実行することができます。

例:

CREATE PROCEDURE GetEmployeeDetails
    @EmployeeID INT,
    @IncludeSalary BIT
AS
BEGIN
    IF @IncludeSalary = 1
    BEGIN
        SELECT Name, BirthDate, Salary FROM Employees WHERE EmployeeID = @EmployeeID;
    END
    ELSE
    BEGIN
        SELECT Name, BirthDate FROM Employees WHERE EmployeeID = @EmployeeID;
    END
END;

このストアドプロシージャでは、@IncludeSalary パラメータの値に応じて、給与情報を含むかどうかを条件分岐しています。

複雑な条件分岐

複数の条件を組み合わせることで、より複雑なロジックを実装できます。

例:

CREATE PROCEDURE FilterEmployees
    @DepartmentID INT = NULL,
    @MinSalary DECIMAL(10, 2) = NULL,
    @MaxSalary DECIMAL(10, 2) = NULL
AS
BEGIN
    SELECT * FROM Employees
    WHERE (@DepartmentID IS NULL OR DepartmentID = @DepartmentID)
    AND (@MinSalary IS NULL OR Salary >= @MinSalary)
    AND (@MaxSalary IS NULL OR Salary <= @MaxSalary);
END;

この例では、@DepartmentID@MinSalary@MaxSalary のパラメータに基づいて従業員をフィルタリングします。パラメータが NULL の場合、その条件は無視されます。

実践例:条件分岐を使用したデータの更新

以下の例では、パラメータを使って従業員のデータを更新する際に条件分岐を行います。

例:

CREATE PROCEDURE UpdateEmployeeInfo
    @EmployeeID INT,
    @NewName NVARCHAR(100) = NULL,
    @NewDepartmentID INT = NULL,
    @NewSalary DECIMAL(10, 2) = NULL
AS
BEGIN
    IF @NewName IS NOT NULL
    BEGIN
        UPDATE Employees SET Name = @NewName WHERE EmployeeID = @EmployeeID;
    END

    IF @NewDepartmentID IS NOT NULL
    BEGIN
        UPDATE Employees SET DepartmentID = @NewDepartmentID WHERE EmployeeID = @EmployeeID;
    END

    IF @NewSalary IS NOT NULL
    BEGIN
        UPDATE Employees SET Salary = @NewSalary WHERE EmployeeID = @EmployeeID;
    END
END;

このストアドプロシージャでは、@NewName@NewDepartmentID@NewSalary の各パラメータに基づいて、対応する従業員情報を更新します。各パラメータが NULL でない場合のみ、そのフィールドが更新されます。

複数パラメータの使用

ストアドプロシージャで複数のパラメータを使用することで、より柔軟かつ複雑なクエリを実行できます。複数パラメータの適切な使用方法とベストプラクティスについて解説します。

複数パラメータの基本

ストアドプロシージャに複数のパラメータを追加するには、それぞれのパラメータをコンマで区切って宣言します。

基本構文:

CREATE PROCEDURE ProcedureName
    @Parameter1 DataType,
    @Parameter2 DataType,
    ...
AS
BEGIN
    -- SQL文をここに記述
END;

例:

CREATE PROCEDURE GetEmployeeInfo
    @EmployeeID INT,
    @DepartmentID INT
AS
BEGIN
    SELECT * FROM Employees WHERE EmployeeID = @EmployeeID AND DepartmentID = @DepartmentID;
END;

この例では、@EmployeeID@DepartmentID の2つのパラメータを使用して、特定の従業員の情報を取得します。

パラメータのデフォルト値

パラメータにデフォルト値を設定することで、呼び出し時に値を省略できるようになります。

例:

CREATE PROCEDURE GetEmployeesByDepartment
    @DepartmentID INT = NULL
AS
BEGIN
    IF @DepartmentID IS NULL
    BEGIN
        SELECT * FROM Employees;
    END
    ELSE
    BEGIN
        SELECT * FROM Employees WHERE DepartmentID = @DepartmentID;
    END
END;

このストアドプロシージャでは、@DepartmentID が指定されない場合、すべての従業員を取得し、指定された場合は特定の部署の従業員のみを取得します。

パラメータの順序と指定

ストアドプロシージャを呼び出す際に、パラメータの順序に注意が必要です。パラメータ名を指定することで順序に依存しない呼び出しが可能です。

例:

EXEC GetEmployeeInfo @EmployeeID = 1, @DepartmentID = 2;

この呼び出しでは、パラメータ名を指定することで、順序に関係なく正しく値を渡すことができます。

実践例:複数パラメータを使用したデータの挿入

以下の例では、複数のパラメータを使用して新しい従業員のデータを挿入します。

例:

CREATE PROCEDURE AddEmployee
    @EmployeeName NVARCHAR(100),
    @BirthDate DATE,
    @Salary DECIMAL(10, 2),
    @DepartmentID INT
AS
BEGIN
    INSERT INTO Employees (Name, BirthDate, Salary, DepartmentID)
    VALUES (@EmployeeName, @BirthDate, @Salary, @DepartmentID);
END;

このストアドプロシージャでは、@EmployeeName@BirthDate@Salary@DepartmentID の4つのパラメータを使用して新しい従業員の情報を挿入します。

実践例:動的SQLの生成

パラメータを使用して動的SQLを生成することで、柔軟かつ汎用的なクエリを作成できます。ただし、動的SQLを使用する際には、SQLインジェクションのリスクに注意し、適切な対策を講じることが重要です。

動的SQLの基本構文

動的SQLを使用するためには、EXEC または sp_executesql を使用してSQLステートメントを実行します。特に、sp_executesql を使用することで、パラメータ化されたクエリを実行でき、安全性が向上します。

例:

CREATE PROCEDURE SearchEmployees
    @SearchTerm NVARCHAR(100)
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = 'SELECT * FROM Employees WHERE Name LIKE @Term'

    EXEC sp_executesql @SQL, N'@Term NVARCHAR(100)', @Term = '%' + @SearchTerm + '%'
END;

このストアドプロシージャでは、@SearchTerm パラメータを使用して、従業員名に部分一致するレコードを検索します。

動的SQLの利点と注意点

動的SQLを使用する利点は以下の通りです:

  • フレキシビリティ:クエリを実行時に動的に変更できる。
  • 再利用性:異なる条件で同じ基本クエリを再利用できる。

注意点:

  • SQLインジェクションのリスク:ユーザー入力を直接動的SQLに使用すると、SQLインジェクション攻撃のリスクがあるため、パラメータ化されたクエリを使用する。
  • パフォーマンス:動的SQLは通常のSQLよりもパフォーマンスが低下する可能性がある。

実践例:複数条件による動的SQLの生成

以下の例では、複数のパラメータを使用して、複数条件に基づいた動的SQLを生成します。

例:

CREATE PROCEDURE FilterEmployees
    @Name NVARCHAR(100) = NULL,
    @MinSalary DECIMAL(10, 2) = NULL,
    @MaxSalary DECIMAL(10, 2) = NULL
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = 'SELECT * FROM Employees WHERE 1=1'

    IF @Name IS NOT NULL
    BEGIN
        SET @SQL = @SQL + ' AND Name LIKE @Name'
    END

    IF @MinSalary IS NOT NULL
    BEGIN
        SET @SQL = @SQL + ' AND Salary >= @MinSalary'
    END

    IF @MaxSalary IS NOT NULL
    BEGIN
        SET @SQL = @SQL + ' AND Salary <= @MaxSalary'
    END

    EXEC sp_executesql @SQL,
        N'@Name NVARCHAR(100), @MinSalary DECIMAL(10, 2), @MaxSalary DECIMAL(10, 2)',
        @Name = '%' + @Name + '%',
        @MinSalary = @MinSalary,
        @MaxSalary = @MaxSalary
END;

このストアドプロシージャでは、@Name@MinSalary@MaxSalary の各パラメータに基づいて、従業員をフィルタリングします。各条件は動的に追加されます。

パラメータの検証とエラーハンドリング

ストアドプロシージャでパラメータを使用する際には、パラメータの値を検証し、適切なエラーハンドリングを行うことが重要です。これにより、データの一貫性と信頼性を確保できます。

パラメータの検証

ストアドプロシージャ内でパラメータの値を検証することで、不正なデータや予期しないエラーを防ぐことができます。

例:

CREATE PROCEDURE UpdateEmployeeSalary
    @EmployeeID INT,
    @NewSalary DECIMAL(10, 2)
AS
BEGIN
    -- パラメータの検証
    IF @EmployeeID <= 0
    BEGIN
        RAISERROR('EmployeeID must be greater than 0', 16, 1)
        RETURN
    END

    IF @NewSalary < 0
    BEGIN
        RAISERROR('Salary cannot be negative', 16, 1)
        RETURN
    END

    -- 更新処理
    UPDATE Employees SET Salary = @NewSalary WHERE EmployeeID = @EmployeeID;
END;

このストアドプロシージャでは、@EmployeeID が正の整数であること、@NewSalary が負の値でないことを検証しています。条件を満たさない場合はエラーを発生させ、処理を中断します。

エラーハンドリング

ストアドプロシージャ内で発生する可能性のあるエラーに対して適切に対処することが重要です。これには、TRY...CATCH ブロックを使用する方法が一般的です。

例:

CREATE PROCEDURE TransferEmployee
    @EmployeeID INT,
    @NewDepartmentID INT
AS
BEGIN
    BEGIN TRY
        -- トランザクション開始
        BEGIN TRANSACTION

        -- 部署の更新
        UPDATE Employees SET DepartmentID = @NewDepartmentID WHERE EmployeeID = @EmployeeID;

        -- コミット
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        -- ロールバック
        ROLLBACK TRANSACTION

        -- エラーメッセージの取得
        DECLARE @ErrorMessage NVARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()

        -- エラーを発生させる
        RAISERROR(@ErrorMessage, 16, 1)
    END CATCH
END;

このストアドプロシージャでは、トランザクション内で部署の更新を行い、エラーが発生した場合はトランザクションをロールバックしてエラーメッセージを表示します。

実践例:パラメータの検証とエラーハンドリングを組み合わせる

以下の例では、パラメータの検証とエラーハンドリングを組み合わせて、より堅牢なストアドプロシージャを作成します。

例:

CREATE PROCEDURE PromoteEmployee
    @EmployeeID INT,
    @NewTitle NVARCHAR(100),
    @NewSalary DECIMAL(10, 2)
AS
BEGIN
    BEGIN TRY
        -- パラメータの検証
        IF @EmployeeID <= 0
        BEGIN
            RAISERROR('EmployeeID must be greater than 0', 16, 1)
            RETURN
        END

        IF @NewSalary < 0
        BEGIN
            RAISERROR('Salary cannot be negative', 16, 1)
            RETURN
        END

        -- トランザクション開始
        BEGIN TRANSACTION

        -- 従業員の昇進
        UPDATE Employees SET Title = @NewTitle, Salary = @NewSalary WHERE EmployeeID = @EmployeeID;

        -- コミット
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        -- ロールバック
        ROLLBACK TRANSACTION

        -- エラーメッセージの取得
        DECLARE @ErrorMessage NVARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()

        -- エラーを発生させる
        RAISERROR(@ErrorMessage, 16, 1)
    END CATCH
END;

このストアドプロシージャでは、従業員IDと新しい給与の値を検証し、トランザクション内で昇進処理を行います。エラーが発生した場合はトランザクションをロールバックし、エラーメッセージを表示します。

応用例:ストアドプロシージャによるバッチ処理

ストアドプロシージャは、バッチ処理を効率的に実行するための強力なツールです。大量のデータを一括で操作する際に、ストアドプロシージャを使用することで、パフォーマンスの向上とコードの再利用が可能になります。

バッチ処理の基本概念

バッチ処理とは、大量のデータを一括して処理する方法で、データの挿入、更新、削除などを一度に実行することを指します。これにより、個別に処理するよりも効率的にデータ操作が行えます。

バッチ処理のメリット

  • パフォーマンス向上:一度に大量のデータを処理するため、個別処理よりも高速です。
  • 一貫性:トランザクションを使用して一貫性を保つことができます。
  • 再利用性:同じ処理を何度も実行できるため、コードの再利用性が高まります。

バッチ処理の例:従業員の給与更新

以下のストアドプロシージャでは、指定された条件に基づいて従業員の給与を一括で更新します。

例:

CREATE PROCEDURE UpdateSalariesBatch
    @DepartmentID INT,
    @SalaryIncrease DECIMAL(10, 2)
AS
BEGIN
    BEGIN TRY
        -- トランザクション開始
        BEGIN TRANSACTION

        -- 指定された部署の従業員の給与を更新
        UPDATE Employees
        SET Salary = Salary + @SalaryIncrease
        WHERE DepartmentID = @DepartmentID;

        -- コミット
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        -- ロールバック
        ROLLBACK TRANSACTION

        -- エラーメッセージの取得
        DECLARE @ErrorMessage NVARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()

        -- エラーを発生させる
        RAISERROR(@ErrorMessage, 16, 1)
    END CATCH
END;

このストアドプロシージャでは、特定の部署の従業員全員の給与を一括で更新します。トランザクションを使用して、一貫性を保ち、エラーが発生した場合はロールバックします。

バッチ処理の例:大量データの挿入

以下のストアドプロシージャでは、別のテーブルからデータを読み込み、大量のレコードを一括で挿入します。

例:

CREATE PROCEDURE InsertNewEmployeesBatch
AS
BEGIN
    BEGIN TRY
        -- トランザクション開始
        BEGIN TRANSACTION

        -- 新規従業員データを一括で挿入
        INSERT INTO Employees (Name, BirthDate, Salary, DepartmentID)
        SELECT Name, BirthDate, Salary, DepartmentID
        FROM NewEmployees;

        -- コミット
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        -- ロールバック
        ROLLBACK TRANSACTION

        -- エラーメッセージの取得
        DECLARE @ErrorMessage NVARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()

        -- エラーを発生させる
        RAISERROR(@ErrorMessage, 16, 1)
    END CATCH
END;

このストアドプロシージャでは、NewEmployees テーブルからデータを読み込み、Employees テーブルに一括で挿入します。トランザクションを使用して、一貫性を確保し、エラーが発生した場合はロールバックします。

演習問題

学習を深め、実践的なスキルを磨くための演習問題を提供します。これらの問題を通じて、ストアドプロシージャのパラメータの使い方やバッチ処理の応用例をさらに理解することができます。

演習問題1:基本的なストアドプロシージャの作成

次の要件に基づいて、基本的なストアドプロシージャを作成してください。

  • EmployeeID を入力パラメータとして受け取り、その従業員の詳細情報を取得するストアドプロシージャを作成する。
  • 従業員の情報には、NameBirthDateDepartmentID が含まれる。

解答例

CREATE PROCEDURE GetEmployeeDetails
    @EmployeeID INT
AS
BEGIN
    SELECT Name, BirthDate, DepartmentID
    FROM Employees
    WHERE EmployeeID = @EmployeeID;
END;

演習問題2:条件分岐を使用したストアドプロシージャの作成

次の要件に基づいて、条件分岐を使用したストアドプロシージャを作成してください。

  • DepartmentIDMinSalary を入力パラメータとして受け取り、指定された条件に基づいて従業員をフィルタリングする。
  • DepartmentID が NULL の場合は、全従業員を検索する。
  • MinSalary が NULL の場合は、給与に関する条件を適用しない。

解答例

CREATE PROCEDURE FilterEmployees
    @DepartmentID INT = NULL,
    @MinSalary DECIMAL(10, 2) = NULL
AS
BEGIN
    SELECT * FROM Employees
    WHERE (@DepartmentID IS NULL OR DepartmentID = @DepartmentID)
    AND (@MinSalary IS NULL OR Salary >= @MinSalary);
END;

演習問題3:エラーハンドリングを含むストアドプロシージャの作成

次の要件に基づいて、エラーハンドリングを含むストアドプロシージャを作成してください。

  • EmployeeIDNewSalary を入力パラメータとして受け取り、従業員の給与を更新する。
  • EmployeeID が 0 以下の場合や NewSalary が負の値の場合は、エラーを発生させる。
  • トランザクションを使用して、一貫性を保つ。

解答例

CREATE PROCEDURE UpdateEmployeeSalary
    @EmployeeID INT,
    @NewSalary DECIMAL(10, 2)
AS
BEGIN
    BEGIN TRY
        -- パラメータの検証
        IF @EmployeeID <= 0
        BEGIN
            RAISERROR('EmployeeID must be greater than 0', 16, 1)
            RETURN
        END

        IF @NewSalary < 0
        BEGIN
            RAISERROR('Salary cannot be negative', 16, 1)
            RETURN
        END

        -- トランザクション開始
        BEGIN TRANSACTION

        -- 従業員の給与を更新
        UPDATE Employees SET Salary = @NewSalary WHERE EmployeeID = @EmployeeID;

        -- コミット
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        -- ロールバック
        ROLLBACK TRANSACTION

        -- エラーメッセージの取得
        DECLARE @ErrorMessage NVARCHAR(4000)
        SELECT @ErrorMessage = ERROR_MESSAGE()

        -- エラーを発生させる
        RAISERROR(@ErrorMessage, 16, 1)
    END CATCH
END;

まとめ

SQLストアドプロシージャのパラメータを活用することで、データ操作の効率性と柔軟性が大幅に向上します。この記事では、パラメータの種類、宣言方法、実践例、エラーハンドリング、バッチ処理の応用例など、基本から応用までを幅広くカバーしました。これらの知識を活かして、より複雑で高効率なデータベース操作を実現しましょう。パラメータを適切に使用することで、安全で保守しやすいSQLコードを作成することができます。

コメント

コメントする

目次