사용자 정의 함수의 종류
- 사용자 정의 스칼라 함수 : RETURN 문에 의해서 하나의 단일값을 반환하는 함수
- 사용자 정의 테이블 반환 함수 : RETURN 값이 테이블인 함수
사용자 정의 스칼라 함수
- 예시 : 출생년도를 입력하면 나이를 반환하는 함수
1 2 3 4 5 6 7 8 9 | CREATE FUNCTION ufn_getAge(@byear INT) -- 매개 변수를 정수로 받음 RETURNS INT -- 리턴값은 정수형 AS BEGIN DECLARE @age INT SET @age = YEAR(GETDATE()) - @byear + 1 RETURN(@age) END GO | cs |
사용자 정의 테이블 반환 함수
- 인라인 테이블 반환 함수
(형식)
1 2 3 4 | CREATE FUNCTION 함수이름 (매개 변수) RETURNS TABLE AS RETURN(단일 SELECT 문장) | cs |
- 예시 : 입력한 값보다 키가 큰 사용자들을 돌려주는 함수
1 2 3 4 5 6 7 8 9 | -- 함수 생성 CREATE FUNCTION ufn_getUser(@ht INT) RETURNS TABLE AS RETURN(SELECT userID AS [아이디], name AS [이름], height AS [키] FROM userTbl WHERE height > @ht) GO -- 함수 호출 SELECT * FROM dbo.ufn_getUser(177); | cs |
- 결과
- 다중 문 테이블 반환 함수
(형식)
1 2 3 4 5 6 7 8 | CREATE FUNCTION 함수이름 ( 매개 변수 ) RETURNS @테이블변수 TABLE ( 열이름과 데이터 형식 정의... ) AS BEGIN 위(헤더)에서 정의한 테이블변수에 행을 INSERT시키는 작업들... RETURN END | cs |
- 예시 : 정수값을 매개 변수로 받고 출생년도가 매개 변수 이후인 고객들만 등급을 분류하며, 행이 하나도 없다면 '없음'으로 출력하는 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | CREATE FUNCTION ufn_userGrade(@bYear INT) -- 리턴할 테이블의 정의(@retTable은 BEGIN ... END에서 사용될 테이블 변수) RETURNS @retTable TABLE (userID char(8), name nchar(10), grade nchar(5)) AS BEGIN DECLARE @rowCnt INT; -- 행 개수를 카운트 SELECT @rowCnt = COUNT(*) FROM userTbl WHERE birthYear >= @bYear; -- 행이 하나도 없으면 '없음'이라고 입력하고 테이블을 리턴함 IF (@rowCnt <= 0) BEGIN INSERT INTO @retTable VALUES('없음','없음','없음'); RETURN; END; -- 행이 1개 이상 있다면 INSERT INTO @retTable SELECT U.userID,U.name, CASE WHEN (sum(price*amount) >= 1500) THEN N'최우수고객' WHEN (sum(price*amount) >= 1000) THEN N'우수고객' WHEN (sum(price*amount) >= 1) THEN N'일반고객' ELSE N'유령고객' END FROM buyTbl AS B RIGHT OUTER JOIN userTbl U ON B.userID = U.userID WHERE birthYear >= @bYear GROUP BY U.userID, U.name; RETURN; END; GO | cs |
- 호출 1
1 | SELECT * FROM dbo.ufn_userGrade(1970); | cs |
- 결과
- 호출 2
1 | SELECT * FROM dbo.ufn_userGrade(1990); | cs |
- 결과
참고문헌
우재남, 『뇌를 자극하는 SQL Server 2012』 한빛미디어 (2013-03-02 초판발행)
'DEV LOGS' 카테고리의 다른 글
[MSSQL] 테이블 변수 VS 임시 테이블 (0) | 2018.07.10 |
---|---|
[MSSQL] 스키마 바운드 함수 (0) | 2018.07.10 |
[MSSQL] 사용자 정의 함수 (0) | 2018.07.10 |
[MSSQL] 저장 프로시저(Stored Procedure)의 문제점 (0) | 2018.07.10 |
[MSSQL] T-SQL(Transact SQL) VS Stored Procedure (0) | 2018.07.10 |