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;

이 저장 프로시저는 실행되면 직원 테이블에서 모든 레코드를 가져옵니다.

매개변수의 종류 및 특징

저장 프로시저는 여러 매개변수를 사용하여 유연한 데이터 조작이 가능합니다. 매개변수의 종류에는 입력 매개변수, 출력 매개변수, 입력 출력 매개변수의 세 가지가 있습니다. 각각의 특징과 용도에 대해 자세히 살펴보겠습니다.

입력 매개변수

입력 매개변수는 저장 프로시저에 값을 전달하기 위해 사용됩니다. 호출자에서 값을 받아 그 값을 기반으로 처리합니다. 선언에는 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의 두 입력 매개변수를 사용하여 직원의 부서를 업데이트합니다.

매개변수를 사용한 예: 데이터 삽입

매개변수를 사용하여 데이터를 삽입하는 예를 보여줍니다.

예:

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 두 매개변수를 사용하여 특정 직원의 정보를 가져옵니다.

매개변수의 기본값

매개변수에 기본값을 설정하여 호출 시 값을 생략할 수 있도록 합니다.

예:

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 네 가지 매개변수를 사용하여 새로운 직원의 정보를 삽입합니다.

실습 예제: 동적 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를 입력 매개변수로 받아 해당 직원의 세부 정보를 조회하는 저장 프로시저를 생성하십시오.
  • 직원 정보에는 Name, BirthDate, DepartmentID가 포함됩니다.

해답 예시

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 코드를 작성할 수 있습니다.

목차