SQL을 하면서, Table / Stored Procedure(SP)는 많이 사용해봤다.
하지만, 함수(Function)는 그닥...많이 사용하지 않았는데 이번에 사용해보면서 정리해보려고 한다.
함수(Function) 문법
1
2
3
4
5
6
7
8
|
CREATE FUNCTION 함수이름 (
INPUT 파라미터
) RETURNS 리턴타입
AS
BEGIN
QUERY
RETURN 리턴값;
END
|
cs |
함수를 만들때 유의해야 할 점이 몇 가지 있다.
Stored Procedure (SP)와 달리, INPUT 파라미터는 사용할 수 있지만 OUTPUT 파라미터는 사용할 수 없다.
그리고 RETURNS 이후에 리턴타입에는 데이터타입(INT, VARCHAR등)과 TABLE을 리턴해줄 수 있다.
BEGIN END 으로 함수의 시작과 끝을 정의할 수 있고,
RETURN 이후에 우리는 반드시 값을 리턴해주어야 한다.
유의해야할 사항을 잊지말고, 아래 예제를 살펴보면 더 쉽게 함수(Function)에 대해 이해할 수 있을 것이다.
그전에 샘플 테이블/데이터를 만들었다. 함수(Function)에서는 임시테이블을 사용할 수 없으므로 이점도 알고있자.
샘플 테이블/데이터
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-- 테스트 테이블 생성
CREATE TABLE TEST (
num INT IDENTITY PRIMARY KEY,
name NVARCHAR(50),
age INT,
job NVARCHAR(100),
reg_date DATETIME
)
-- 테스트 데이터 추가
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('홍길동', 20, '도적', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('마동석', 40, '배우', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('이승엽', 32, '야구선수', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('이순신', 74, '장군', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('박정민', 34, '배우', GETDATE());
INSERT INTO TEST (name, age, job, reg_date)
VALUES ('박지성', 39, '축구선수', GETDATE());
|
cs |
함수(Function) 예제 (스칼라 반환 함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE FUNCTION GET_JOB_COUNT (
@job NVARCHAR(50)
) RETURNS INT
AS
BEGIN
DECLARE @count INT;
SELECT @count = ISNULL(COUNT(1), 0)
FROM TEST
WHERE job = @job
RETURN @count;
END
|
cs |
GET_JOB_COUNT 라는 함수명을 가진 함수(Function)을 만들었다.
@job 이라는 INPUT 파라미터를 설정, 리턴값은 INT 데이터 타입을 설정해주었다.
그리고 SQL를 수행하여, 테이블에 해당 job이 몇명인지 리턴해주었다.
함수(Function) 예제 (테이블 반환 함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
CREATE FUNCTION GET_JOB_NAME (
@job NVARCHAR(50)
) RETURNS @rst TABLE (
num INT,
name NVARCHAR(50)
)
AS
BEGIN
INSERT INTO @rst (num, name)
SELECT num, name
FROM TEST
WHERE job = @job;
RETURN
END
|
cs |
위에 있는 스칼라 반환 함수와 조금 다르다.
함수명과 INPUT 파라미터는 동일하지만, 리턴은 TABLE을 미리 만들어주었다. 해당 TABLE인 @rst에 값을 설정해주면 그 값을 리턴해주겠다는 것을 의미한다.
@rst에 데이터를 넣어주고 RETURN문을 적어주면 끝난다. 스칼라 반환 함수와 조금씩 다르니 이점을 유념하자.
'개발 > MSSQL' 카테고리의 다른 글
[SQL] NULL체크 함수, ISNULL/COALESCE 알아보자. (0) | 2020.01.31 |
---|---|
[SQL] 랭크함수와 PARTITION BY를 이용하여 1등만 뽑아보자. (4) | 2020.01.29 |
[SQL] CASE WHEN, 데이터 형식 변환 오류 해결 방법 (2) | 2020.01.02 |
[SQL] 동적쿼리를 사용해보자 (feat.SP_EXECUTESQL) (0) | 2019.12.04 |
[SQL] ROW_NUMBER, RANK, DENSE_RANK 차이점 (0) | 2019.12.04 |