강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

:: 사용자 정의 함수(User Defined Function) ::
작성자 : 13 김영철
등록날짜 : 2009.01.24 23:06
2,679

1. 사용자 정의 함수란

저장 프로시져(Stored Procedure)가 어떠한 처리를 위해 수행되는것과는 달리 함수는 짐작되다시피 어떤 특정한 값을 사용자에게 넘겨주는(리턴) 기능을 갖습니다. 예를 들어 GetDate() 함수는 현재의 날짜를 리턴해줍니다. SQL Server 2000에서는 사용자가 자신만의 함수를 만들 수 있는 기능을 제공합니다. 이것이 사용자 정의 함수(User Defined Function)입니다. 물론 저장 프로시져도 OUTPUT 매개변수를 이용하여 값을 넘겨줄수 있지만 값을 얻기위해 저장 프로시져를 사용하기는 적당하지 않은 부분이 많습니다. 사용자 정의함수는 특정한 값만을 리턴하는게 아니고 테이블을 리턴해주기도 합니다. 또한 쿼리문의 여러 부분에서 사용될 수 있어 업무에 많은 도움을 줍니다. 이 부분에 대해서는 나중에 확인하도록 하겠습니다.

사용자 정의 함수는 CREATE FUNCTION을 이용해서 만들고 DROP FUNCTION을 이용해서 제거되며 ALTER FUNCTION을 이용해서 변경되어집니다. CREATE FUNCTION은 만들어지는 사용자 정의 함수의 종류에따라 여러가지 방법이 있습니다. 우선 사용자 정의 함수의 종류를 알아보고 각 종류별로 만드는 방법과 사용예를 살펴보도록 하겠습니다.

사용자 정의 함수는 다음과 같이 분류할 수 있습니다.

o 스칼라 반환 사용자 정의 함수 (Scalar Functions)
o 인라인 테이블 반환 함수 (In-Line Table-valued Functions)
o 다중 문 테이블 반환 함수 (Multi-Statement Table-valued Functions)

1) 스칼라 반환 사용자 정의 함수(Scalar Functions)

GetDate()함수의 경우 리턴하는 값은 현재의 날짜입니다. 이렇듯 특정 값만을 리턴하는 함수를 Scalar Function 이라고 합니다. 만일 두 값의 합을 구하여 리턴해주는 사용자 정의 함수를 구현한다면 다음과 같이 만들수 있습니다.

[예제1]

CREATE FUNCTION fn_sum (@val01 int, @val02 int) -- 1)
RETURNS int -- 2)
AS
BEGIN
RETURN (@val01 + @val02) -- 3)
END
GO

SELECT dbo.fn_sum(100, 200) -- 4)

o '--' 는 수행과는 아무 상관없는 Comments 를 위해 사용됩니다.
o 1)에서 CREATE FUNCTION을 사용했습니다. 이때 만들어지는 함수의 이름은 fn_sum이며, @val01과 @val02 두개의 int 타입 매개변수가 사용됨을 알 수 있습니다.
o 2)에서 fn_sum 함수가 int 타입의 값을 리턴한다고 지정하고 있습니다.
o 3)에서 함수에 전달된 @val01과 @val02의 값을 더한 결과를 RETURN하고 있습니다.
o 4)의 SELECT 결과는 100과 200의 합인 300이 됩니다. 사용자 정의 함수를 호출 할때는 이처럼 '소유자.함수이름(매개번수)' 형태를 취해야 합니다. 수유자가 dbo라 하더라도 생략할 수 없습니다.

[예제2]

CREATE FUNCTION fn_DateFormat(@indate datetime, @separator char(1))
RETURNS Nchar(20)
AS
BEGIN
RETURN
CONVERT(Nvarchar(20), datepart(mm,@indate))
+ @separator
+ CONVERT(Nvarchar(20), datepart(dd, @indate))
+ @separator
+ CONVERT(Nvarchar(20), datepart(yy, @indate))
END
GO

SELECT dbo.fn_DateFormat(GetDate(),'/')

o 날짜를 지정한 문자로 월,일,년을 분리하여 보시해주는 사용자 정의 함수의 예입니다.

※ 사용자 정의함수 호출 방법

스칼라 사용자 정의 함수를 호출할 때는 적어도 다음과 같이 두 부분(소유자.함수명)으로 된 이름을 제공해야 합니다.
SELECT *, MyUser.MyScalarFunction()
FROM MyTable

테이블 값을 리턴하는 함수는 다음과 같이 한 부분으로 된 이름을 사용하여 호출할 수 있습니다.
SELECT *
FROM MyTableFunction()

그러나 테이블을 반환하는 SQL Server 기본 제공 함수를 사용할 때는 함수 이름에 접두어 ::를 추가해야 합니다.
SELECT * FROM ::fn_helpcollations()

2) 인라인 테이블 반환 함수 (In-Line Table-valued Functions)

인라인 테이블 변환 함수는 함수 본문이 하나의 SELECT 문으로 정의된 테이블 반환 함수입니다.인라인 사용자 정의 함수는 다음 규칙을 따릅니다.

o RETURNS 절에는 키워드 table만 포함됩니다. 반환 변수 형식은 RETURN 절에 있는 SELECT 문의 결과 집합에서 설정되므로 사용자가 정의하지 않아도 됩니다.
o BEGIN과 END로 구분되는 function_body는 없습니다.
o RETURN 절에는 하나의 SELECT 문이 괄호 안에 포함됩니다. 함수에서 반환하는 테이블은 SELECT 문의 결과 집합으로 구성됩니다. 인라인 함수에서 사용되는 SELECT 문은 뷰에서 사용되는 SELECT 문과 같은 제한을 받습니다.

[예제1]

USE pubs
GO

CREATE FUNCTION SalesByStore (@storeid varchar(30))
RETURNS TABLE
AS
RETURN (SELECT title, qty
FROM sales s, titles t
WHERE s.stor_id = @storeid and t.title_id = s.title_id)

o 진하게 표시된 부분을 자세히 살펴보시기 바랍니다.
o 다른 사용자 정의 함수와는 달리 BEGIN...END문이 없습니다.
o RETURN 문의 괄호안에 하나의 SELECT문이 포함되어 있습니다.
o 다음의 뷰(VIEW)를 보면 위 SalesByStore 함수와 같은 내용을 표시해 주지만 여러가지 경우에 따른 변화된 내용을 보여주지는 못합니다. 이런 뷰의 단점을 인라인 테이블 반환 함수는 해결해 줍니다.

USE pubs
GO

CREATE VIEW vw_Sales
AS
SELECT title, qty
FROM sales s, titles t
WHERE t.title_id = s.title_id

다음은 위의 사용자 정의 함수와 뷰를 이용하여 검색하는 예입니다. 처음의 사용자 정의 함수는 Stor_id가 7067인 것만을 표시하지만 뷰는 전체를 다 표시하게 됩니다.

SELECT * FROM SalesByStore(7067)
SELECT * FROM vw_Sales

3) 다중 문 테이블 반환 함수 (Multi-Statement Table-valued Functions)

다중 문 테이블 변환 함수는 뷰(VIEW)와 저장 프로시져(Stored Procedure)의 복합형태로 생각히시면 됩니다. 즉, 뷰처럼 테이블을 반환해주고, 저장 프로시져처럼 여러가지 처리를 함수 내부에서 하게됩니다. 이런 이유로 함수를 만드는 형태가 꽤나 복잡합니다.

table을 반환하는 사용자 정의 함수에서는 다음을 수행합니다.

o RETURNS 절에서 함수가 반환한 테이블에 로컬 반환 변수 이름을 정의합니다.
o RETURNS 절에서 테이블 형식도 정의합니다. 로컬 반환 변수 이름의 범위는 함수 내에서 로컬입니다.
o 함수 본문에 있는 Transact-SQL 문에서 행을 작성하여 RETURNS 절에서 정의된 반환 변수에 삽입합니다.
o RETURN 문이 실행될 때 변수에 삽입된 행은 함수의 테이블 형식 출력으로 반환됩니다. RETURN 문에서는 인수를 사용할 수 없습니다.
o 테이블을 반환하는 함수에 있는 어떠한 Transact-SQL 문도 사용자에게 직접 결과 집합을 반환할 수 없습니다.
o 함수에서 사용자에게 반환할 수 있는 유일한 정보는 함수에서 반환된 table입니다.

두가지 예제를 보면서 만드는 방법을 확인하도록 하겠습니다. 첫번째 예제는 MOC 교재에 수록된 것이며, 두번째 예제는 Books Online에 수록된 예제입니다.

[예제1]

USE Northwind
GO

CREATE FUNCTION fn_Employees (@length nvarchar(9))
RETURNS @fn_Employees table
(EmployeeID int PRIMARY KEY NOT NULL,
[Employee Name] nvarchar(61) NOT NULL)

AS
BEGIN
IF @length = 'ShortName'
INSERT @fn_Employees SELECT EmployeeID, LastName
FROM Employees
ELSE IF @length = 'LongName'
INSERT @fn_Employees SELECT EmployeeID,
(FirstName + ' ' + LastName) FROM Employees

RETURN
END
GO

SELECT * FROM dbo.fn_Employees('LongName')
-- 또는
SELECT * FROM dbo.fn_Employees('ShortName')

o 진하게 표시된 부분을 자세히 살펴보시기 바랍니다.
o 만드는 방법이 다소 복잡하게 보입니다.
o RETURNS 문에 @fn_Employees 테이블이 컬럼 구조와 함께 선언되어 있습니다.
o 이 @fn_Employees 테이블에 SELECT결과를 INSERT해주고 있습니다.
o @fn_Employees 테이블의 내용이 실제 함수가 리턴해주는 결과입니다.

[예제2]

CREATE FUNCTION LargeOrderShippers (@FreightParm money)
RETURNS @OrderShipperTab TABLE
(
ShipperID int,
ShipperName nvarchar(80),
OrderID int,
ShippedDate datetime,
Freight money
)
AS
BEGIN
INSERT @OrderShipperTab
SELECT S.ShipperID, S.CompanyName,
O.OrderID, O.ShippedDate, O.Freight
FROM Shippers AS S INNER JOIN Orders AS O
ON S.ShipperID = O.ShipVia
WHERE O.Freight > @FreightParm
RETURN
END

o [예제1]과 형식이 똑 같습니다.
o 다른 것은 함수 이름과 테이블 구조와 어떤 결과가 이 테이블에 기록되어 리턴되는가 하는 것뿐입니다.

4) 기타

사용자 정의 함수는 SQL Server 2000에서 처음 선보이는 기능이므로 이전 버젼 사용자에게는 꽤 낯설게 보일 수 있지만 이 기능을 활용하면 많은 도움을 받을 수 있습니다. 사용자 정의 함수는 WHERE 절에도 사용이 가능하며 FROM 절에도 사용이 가능합니다. Books Online에 사용자 정의 함수에 대한 많은 설명이 포함되어 있습니다. Books Online의 내용을 꼭 확인하여 보시기 바랍니다.

---------------------------------------------------------------------------------------

출처 : http://www.sqlworld.pe.kr

[출처] 태쥐

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
열람중 :: 사용자 정의 함수(User Defined Function) :: 13 김영철 01.24 2680
2684 :: 트리거(Trigger) :: 13 김영철 01.24 2375
2683 :: 백업(Backup) 이란? :: 13 김영철 01.24 2499
2682 :: 백업 장치 만들기 :: 13 김영철 01.24 2318
2681 :: 전체 백업 받기 :: 13 김영철 01.24 2293
2680 :: 전체 백업으로부터의 복원 :: 13 김영철 01.24 2500
2679 :: 차등 백업 받기와 복원 :: 13 김영철 01.24 2121
2678 :: 데이터베이스 옵션을 이용한 트랜잭션 로그 제어 :: 13 김영철 01.24 2884
2677 :: 트랜잭션 로그 줄이기 테스트 :: 13 김영철 01.24 2303
2676 :: 백업과 복원 정리 :: 13 김영철 01.24 2009
2675 :: SQL Server Agent 서비스 이해 :: 13 김영철 01.24 2819
2674 :: [작업 만들기 마법사] 이용하기 :: 13 김영철 01.24 2724
2673 :: 등록된 작업 살펴보기 :: 13 김영철 01.24 2447
2672 :: 새로운 작업 등록하기 :: 13 김영철 01.24 2056
2671 :: 데이터베이스 유지 관리 계획 마법사 :: 13 김영철 01.24 2354
2670 ::[데이터 가져오기 및 보내기]를 이용한 데이터 변환 :: 13 김영철 01.24 2693
2669 :: 기본적인 웹 페이지 만들기 :: 13 김영철 01.24 2107
2668 :: 템플릿을 이용한 웹 페이지 만들기 :: 13 김영철 01.24 2322
2667 ▒엑셀파일을 ms-sql DB테이블로 전환하기 13 김영철 01.24 3250
2666 :: INFOEMATION_SCHEMA 뷰 이용하기 :: 13 김영철 01.24 2119
2665 :: 인증모드와 로그인 관리 :: 13 김영철 01.24 2404
2664 :: 데이터베이스 사용자 추가 13 김영철 01.24 2241
2663 :: 연결된 서버 만들기 13 김영철 01.24 2933
2662 :: 엑셀 워크시트를 연결된 서버로 만들기 13 김영철 01.24 3114
2661 mssql 함수모음 13 김영철 01.24 3401
2660 :: text타입의 본문 문자열바꾸기 Sql 13 김영철 01.24 2345
2659 오라클과 MSSQL 의 날짜 비교 13 김영철 01.24 3563
2658 MSSQL 백업복구 13 김영철 01.24 3113
2657 [MSSQL]쿼리 분석기 더 잘 사용하기 13 김영철 01.24 3413
2656 SQL Injection 기법 정리(MSSQL) 13 김영철 01.24 4172
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취