CREATE PROCEDURE로 저장 프로시저 만들기
CREATE PROCEDURE로 저장 프로시저 만들기
저장 프로시저는 SQL Server Management Studio(SSMS)를 쓰거나, T-SQL의 CREATE PROCEDURE 문으로 직접 만들 수 있어요. 만들려면 데이터베이스에 CREATE PROCEDURE 권한이, 프로시저를 만들 스키마에 ALTER 권한이 필요해요. 예시에 쓰는 샘플 데이터베이스는 SQL Server용 AdventureWorksLT2022, Azure SQL Database용 AdventureWorksLT예요. 저장 프로시저의 개념과 이점은 [저장 프로시저] 항목에서 자세히 다루었으니, 여기서는 만드는 과정을 중심으로 볼게요.
SSMS로 만들기
SSMS의 개체 탐색기에서 만드는 과정을 간단히 정리하면 이래요.
- 개체 탐색기에서 SQL Server 인스턴스나 Azure SQL Database에 연결해요.
- 인스턴스 → 데이터베이스 → 원하는 데이터베이스 → 프로그래밍 기능(Programmability) 순서로 확장해요.
- 저장 프로시저를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기 > 저장 프로시저를 선택해요. 템플릿이 들어 있는 새 쿼리 창이 열려요.
- 쿼리 메뉴에서 템플릿 매개변수 값 지정을 골라 프로시저 이름, 매개변수 이름·데이터 형식·기본값 등을 채워요.
- 쿼리 편집기에서 SELECT 문을 자신의 쿼리로 교체하고, **구문 분석(Parse)**으로 문법을 확인한 뒤 **실행(Execute)**으로 프로시저를 만들어요.
SSMS의 저장 프로시저 템플릿을 채워 만드는 예시는 대략 이렇게 생겼어요. 고객 성·이름을 받아 회사 이름을 돌려주는 프로시저예요.
CREATE PROCEDURE SalesLT.uspGetCustomerCompany
(
@LastName nvarchar(50) = NULL,
@FirstName nvarchar(50) = NULL
)
AS
BEGIN
SET NOCOUNT ON;
SELECT FirstName, LastName, CompanyName
FROM SalesLT.Customer
WHERE FirstName = @FirstName AND LastName = @LastName;
END
GO
이 프로시저를 실행하려면 개체 탐색기에서 프로시저 이름을 오른쪽 클릭하고 저장 프로시저 실행을 선택해 매개변수 값을 넣으면 돼요. 예를 들어 @LastName에 Cannon, @FirstName에 Chris를 넣으면 FirstName Chris, LastName Cannon, CompanyName Outdoor Sporting Goods를 돌려받아요.
T-SQL로 만들기
SSMS 쿼리 편집기에서 직접 T-SQL로도 만들 수 있어요. 프로시저 이름, 매개변수의 이름·데이터 형식, SELECT 문을 자신의 값으로 바꿔서 쓰면 돼요. 기본 형태는 다음과 같아요.
CREATE PROCEDURE <ProcedureName>
@<ParameterName1> <data type>,
@<ParameterName2> <data type>
AS
SET NOCOUNT ON;
SELECT <your SELECT statement>;
GO
예를 들어 위 SSMS 예시와 같은 동작을 하는 프로시저를 T-SQL로 만들면 이래요.
CREATE PROCEDURE SalesLT.uspGetCustomerCompany1
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, CompanyName
FROM SalesLT.Customer
WHERE FirstName = @FirstName AND LastName = @LastName;
GO
만든 뒤 실행하려면 새 쿼리 창에서 EXECUTE 문으로 매개변수 값을 넣어 호출하면 돼요.
주의할 점
- 사용자 입력은 반드시 검증한 뒤에 사용하고, 검증하지 않은 입력을 이어 붙여 명령을 만들지 마세요. 검증되지 않은 사용자 입력으로 만든 명령은 절대 실행하면 안 돼요.
SET NOCOUNT ON은 SELECT에 방해되는 추가 결과 집합을 막아주는 관례로 자주 씁니다.