42
SQL Server SQL Server 2000: 2000: 사사사 사사 사사 사사사 사사 사사 사 사사 사 사사

SQL Server ™ 2000: 사용자 정의 함수 하 성희

  • Upload
    michi

  • View
    87

  • Download
    11

Embed Size (px)

DESCRIPTION

SQL Server ™ 2000: 사용자 정의 함수 하 성희. 사용자 정의 함수 (UDF). 사용자가 함수를 정의하여 사용 가능 SQL Server 2000 에서 추가된 기능 쿼리에서 호출 가능한 다중 명령문 T-SQL 루틴 저장 프로시저의 기능과 뷰의 기능 결합 & flexibility 확장 결과 : 스칼라 값 또는 테이블 값 스키마 바운드로 생성 가능. UDF 의 장점. FROM 절에서, 반환된 결과 사용 가능 테이블의 컬럼에 직접 사용 가능 중간 결과 저장 없이 직접 수행 결과 조인 가능 - PowerPoint PPT Presentation

Citation preview

Page 1: SQL Server ™  2000: 사용자 정의 함수 하 성희

SQL ServerSQL Server™™ 2000: 2000:사용자 정의 함수사용자 정의 함수

하 성희하 성희

Page 2: SQL Server ™  2000: 사용자 정의 함수 하 성희

사용자 정의 함수사용자 정의 함수 (UDF)(UDF)

사용자가 함수를 정의하여 사용 가능사용자가 함수를 정의하여 사용 가능 SQL Server 2000SQL Server 2000 에서 추가된 기능에서 추가된 기능 쿼리에서 호출 가능한 다중 명령문 쿼리에서 호출 가능한 다중 명령문 T-SQL T-SQL

루틴루틴 저장 프로시저의 기능과 뷰의 기능 결합 저장 프로시저의 기능과 뷰의 기능 결합 & &

flexibility flexibility 확장확장 결과 결과 : : 스칼라 값 또는 테이블 값스칼라 값 또는 테이블 값 스키마 바운드로 생성 가능스키마 바운드로 생성 가능

Page 3: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDFUDF 의 장점의 장점 FROM FROM 절에서절에서 , , 반환된 결과 사용 반환된 결과 사용

가능가능 테이블의 컬럼에 직접 사용 가능테이블의 컬럼에 직접 사용 가능 중간 결과 저장 없이 직접 수행 결과 중간 결과 저장 없이 직접 수행 결과

조인 가능조인 가능 IN IN 연산자에서 사용 가능연산자에서 사용 가능 WHERE WHERE 절의 서브 쿼리에서 사용 절의 서브 쿼리에서 사용

가능가능 단일 단일 SELECT SELECT 문으로 작성할 수 없는 문으로 작성할 수 없는

뷰 생성 가능뷰 생성 가능 뷰와 유사하면서 매개 변수 사용 가능뷰와 유사하면서 매개 변수 사용 가능 새로운 산술 함수 생성 용이새로운 산술 함수 생성 용이

Page 4: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDFUDF 의 유형 – 반환 값 기준의 유형 – 반환 값 기준 스칼라 함수스칼라 함수

단일 값 반환단일 값 반환 인라인 테이블 값 함수인라인 테이블 값 함수

단일 단일 SELECT SELECT 문 결과 문 결과 / / table table 값 반환값 반환 다중 명령문 테이블 값 함수다중 명령문 테이블 값 함수

다중 명령문 수행 결과 다중 명령문 수행 결과 / / table table 값 반환값 반환

Page 5: SQL Server ™  2000: 사용자 정의 함수 하 성희

스칼라 함수 스칼라 함수 일반적인 시스템 함수와 같이 일반적인 시스템 함수와 같이

쿼리문에서 사용 가능쿼리문에서 사용 가능 유의 사항유의 사항

Outer BEGIN…END Outer BEGIN…END 사용 금지사용 금지 호출 시 호출 시 Owner Owner 명시 요명시 요

단일 값을 반환단일 값을 반환 다중 명령문다중 명령문 BodyBody 의 맨 마지막에 의 맨 마지막에

RETURN <scalar-expression>RETURN <scalar-expression>

Page 6: SQL Server ™  2000: 사용자 정의 함수 하 성희

스칼라 함수 예제스칼라 함수 예제CREATE FUNCTION dbo.Proper(@Name sysname)CREATE FUNCTION dbo.Proper(@Name sysname)RETURNS sysnameRETURNS sysnameASASBEGINBEGIN DECLARE @len int, @i int, @Outname sysname, @LastSpc bitDECLARE @len int, @i int, @Outname sysname, @LastSpc bit SET @len=DATALENGTH(@Name)SET @len=DATALENGTH(@Name) SET @i=1SET @i=1 SET @LastSpc=1SET @LastSpc=1 SET @Outname=''SET @Outname='' WHILE @i<@len BEGINWHILE @i<@len BEGIN SET @Outname=@Outname+SET @Outname=@Outname+ CASE @Lastspc WHEN 1 THEN UPPER(SUBSTRING(@Name,@i,1))CASE @Lastspc WHEN 1 THEN UPPER(SUBSTRING(@Name,@i,1)) ELSE LOWER(SUBSTRING(@Name,@i,1)) ENDELSE LOWER(SUBSTRING(@Name,@i,1)) END SET @LastSpc=CASE SUBSTRING(@Name,@i,1) WHEN ' ' THEN 1 ELSE SET @LastSpc=CASE SUBSTRING(@Name,@i,1) WHEN ' ' THEN 1 ELSE

0 END0 END SET @i=@i+1SET @i=@i+1 ENDEND RETURN(@Outname)RETURN(@Outname)ENDENDGOGOSELECT dbo.Proper('ha sunghee')SELECT dbo.Proper('ha sunghee') --> --> 결과 결과 : : Ha SungheeHa Sunghee

Page 7: SQL Server ™  2000: 사용자 정의 함수 하 성희

인라인 테이블 값 함수인라인 테이블 값 함수 단일 단일 SELECT SELECT 문으로 구성문으로 구성

RETURN (<select RETURN (<select 문문 >)>) 예제예제

CREATE FUNCTION SalesByStore(@storid varchar(30))CREATE FUNCTION SalesByStore(@storid varchar(30))

RETURNS TABLERETURNS TABLE

ASAS

RETURN (SELECT title, qtyRETURN (SELECT title, qty

FROM sales s, titles tFROM sales s, titles t

WHERE s.stor_id = @storid and WHERE s.stor_id = @storid and

t.title_id = s.title_id)t.title_id = s.title_id)

Page 8: SQL Server ™  2000: 사용자 정의 함수 하 성희

인라인 테이블 값 함수인라인 테이블 값 함수 SELECT SELECT 문의 결과를 반환문의 결과를 반환 함수 함수 bodybody 가 없다가 없다 .. SELECT SELECT 문의 문의 FROM FROM 절에서 사용 가능절에서 사용 가능 ““Parameterized View” Parameterized View” 기능기능 다중 명령문 테이블 값 함수와의 주된 다중 명령문 테이블 값 함수와의 주된

차이점차이점 RETURNS RETURNS 절에 반환 타입을 절에 반환 타입을 TABLE TABLE 로만 로만

기술 기술 (( 정의 불필요정의 불필요 )) 다른 함수 유형과의 차이점다른 함수 유형과의 차이점

outer BEGIN…END outer BEGIN…END 사용 금지사용 금지

Page 9: SQL Server ™  2000: 사용자 정의 함수 하 성희

다중 명령문 테이블 값 함수다중 명령문 테이블 값 함수 Table Table 데이터 타입을 반환데이터 타입을 반환 Header : Header : 반환 반환 table table 변수 정의 포함변수 정의 포함 Body Body 정의정의

INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE 들을 조합 들을 조합 사용하여 반환할 변수의 값을 구성사용하여 반환할 변수의 값을 구성

함수의 마지막 부분에서 반환 변수 값을 반환함수의 마지막 부분에서 반환 변수 값을 반환 결과 바로 처리 가능 결과 바로 처리 가능 임시 테이블 사용 임시 테이블 사용

대체대체

Page 10: SQL Server ™  2000: 사용자 정의 함수 하 성희

다중 명령문 테이블 값 함수 다중 명령문 테이블 값 함수 예제예제

CREATE FUNCTION SalesByStore(@storid varchar(30))CREATE FUNCTION SalesByStore(@storid varchar(30))

RETURNS RETURNS @sales@sales TABLE(title varchar(30), qty int) TABLE(title varchar(30), qty int)

ASAS

BEGINBEGIN

INSERT INSERT @sales@sales

SELECT title, qtySELECT title, qty

FROM sales s, titles tFROM sales s, titles t

WHERE s.stor_id = @storid WHERE s.stor_id = @storid

and t.title_id = s.title_idand t.title_id = s.title_id

RETURNRETURN

ENDEND

Page 11: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDF UDF 작성 시 권장 사항작성 시 권장 사항 시스템 함수 활용시스템 함수 활용 복잡한 함수는 보다 단순한 함수들로 복잡한 함수는 보다 단순한 함수들로

분리분리 모든 행을 반환하는 모든 행을 반환하는 DEFAULTDEFAULT 사용 사용

자제자제 예예 : : WHERE name like ‘@value%’WHERE name like ‘@value%’

WHERE name like ‘%’WHERE name like ‘%’

Page 12: SQL Server ™  2000: 사용자 정의 함수 하 성희

스키마 바운드스키마 바운드 함수를 함수가 참조하는 오브젝트에 함수를 함수가 참조하는 오브젝트에

연결 연결 함수에 영향을 미치는 함수에 영향을 미치는 오브젝트의 변경 방지오브젝트의 변경 방지

SCHEMABINDING SCHEMABINDING 옵션옵션 WITH SCHEMABINDINGWITH SCHEMABINDING

CREATE FUNCTION, CREATE VIEWCREATE FUNCTION, CREATE VIEW ALTER FUNCTION, ALTER VIEWALTER FUNCTION, ALTER VIEW REFERENCES REFERENCES 권한 필요권한 필요

Page 13: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDFUDF 의 제약 사항의 제약 사항 영구 오브젝트 생성 불가영구 오브젝트 생성 불가 임시 테이블 생성 불가임시 테이블 생성 불가

Table Table 변수 사용변수 사용 저장 프로시저 호출 불가저장 프로시저 호출 불가 RAISERROR() RAISERROR() 호출 불가호출 불가 환경 설정 불가환경 설정 불가

예예 : : SET NOCOUNT ONSET NOCOUNT ON

호출 시 호출 시 Four-part name Four-part name 사용 불가사용 불가 Remote function Remote function 호출 시호출 시

오브젝트 이름을 매개 변수로 전달 불가오브젝트 이름을 매개 변수로 전달 불가 인라인 함수에서 인라인 함수에서 ORDER BY ORDER BY 사용하려면 사용하려면

TOP TOP 사용 요사용 요

Page 14: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDF: No Side EffectsUDF: No Side Effects

작업 불가작업 불가 테이블에 대한 테이블에 대한 Update, global cursor Update, global cursor

statements, DDL, transaction statements, DDL, transaction statements statements 등등 ..

작업 가능작업 가능 :: Table Table 변수에 대한 변수에 대한 UpdateUpdate Local cursor statementsLocal cursor statements

Page 15: SQL Server ™  2000: 사용자 정의 함수 하 성희

Workaround – Workaround – 원격 함수 원격 함수 호출호출

1. select testsvr1...calc_interest (10000 , 10 , 1)1. select testsvr1...calc_interest (10000 , 10 , 1)

2. select * from openquery (testsvr1, 2. select * from openquery (testsvr1,

'select dbo.calc_interest (10000 , 10 , 1)')'select dbo.calc_interest (10000 , 10 , 1)')

3. declare @interest int3. declare @interest int

exec testsvr1...sp_executesql N'select exec testsvr1...sp_executesql N'select @int=dbo.calc_interest(@prin, @rate, @int=dbo.calc_interest(@prin, @rate, @years)',@years)',N'@prin int, @rate int, @years int, @int int OUT', N'@prin int, @rate int, @years int, @int int OUT',

10000, 10, 1, @interest OUT10000, 10, 1, @interest OUT

select @interestselect @interest

Page 16: SQL Server ™  2000: 사용자 정의 함수 하 성희

Workaround – Workaround – 저장 프로시저 저장 프로시저 호출 불가호출 불가 저장 프로시저 호출 불가저장 프로시저 호출 불가 확장 프로시저 호출 가능확장 프로시저 호출 가능

XpXp 로 시작하는 이름을 가진 확장 함수에 로 시작하는 이름을 가진 확장 함수에 한함한함

예예 : : sp_executesqlsp_executesql 사용 불가 사용 불가 Sp_executesql Sp_executesql 대체 확장 프로시저 생성 대체 확장 프로시저 생성

및 활용및 활용

Page 17: SQL Server ™  2000: 사용자 정의 함수 하 성희

Workaround – Workaround – 오브젝트 매개 오브젝트 매개 변수화변수화 UDFUDF 에서 사용하는 오브젝트들을 매개 에서 사용하는 오브젝트들을 매개

변수화 할 수 없다변수화 할 수 없다 .. UDFUDF 에서 확장 프로시저는 호출 가능에서 확장 프로시저는 호출 가능 예제예제

Page 18: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDF UDF 호출하기호출하기 스칼라 스칼라 UDF : UDF : 최소 최소 2-2-part name part name 사용사용

예예 : : SELECT dbo.Proper('ha sunghee')SELECT dbo.Proper('ha sunghee')

테이블 값 테이블 값 UDF : 1-part nameUDF : 1-part name 으로도 가능으로도 가능 예예 : : SELECT * FROM SalesByStore('7131')SELECT * FROM SalesByStore('7131')

기본 제공 사용자 정의 함수기본 제공 사용자 정의 함수 1-1-part name part name 사용사용 Table Table 반환 함수 반환 함수 : : 이름에 접두어 이름에 접두어 fn fn 추가추가

예예 : : SELECT * FROM ::fn_helpcollations()SELECT * FROM ::fn_helpcollations()

Page 19: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDF UDF 호출하기호출하기 스칼라 스칼라 UDFUDF 는 는 scalar expression scalar expression

어디서든 사용 가능어디서든 사용 가능 SELECT SELECT 리스트리스트 , WHERE , WHERE 절절 CHECK CHECK 제약 조건 정의제약 조건 정의 DEFAULT DEFAULT 정의정의

Table UDFTable UDF 는 는 FROM FROM 절에서 사용 절에서 사용 가능가능

매개 변수를 완전히 생략할 수는 없음매개 변수를 완전히 생략할 수는 없음 .. DEFAULT DEFAULT 예약어 기술 요예약어 기술 요

Page 20: SQL Server ™  2000: 사용자 정의 함수 하 성희

재귀 호출재귀 호출 저장 프로시저저장 프로시저 , , 트리거와 같이 트리거와 같이 UDFUDF

도 도 recursion recursion 지원지원 제약 사항제약 사항

Nesting level = 32Nesting level = 32 무한 루핑 위험 제거무한 루핑 위험 제거 32 32 초과 가능성 존재 시 방식 변경 요초과 가능성 존재 시 방식 변경 요

Page 21: SQL Server ™  2000: 사용자 정의 함수 하 성희

재귀 호출 재귀 호출 - - 예제예제CREATE FUNCTION dbo.ufn_GetAncestorCREATE FUNCTION dbo.ufn_GetAncestor

((

@empid AS int,@empid AS int,

@lvl AS int = 1 -- @lvl AS int = 1 -- 몇 단계 위 상급자인지 지정몇 단계 위 상급자인지 지정))

RETURNS intRETURNS int

ASAS

BEGINBEGIN

IF @lvl IS NULL or @empid IS NULL or @lvl < 0IF @lvl IS NULL or @empid IS NULL or @lvl < 0

RETURN NULLRETURN NULL

IF @lvl = 0IF @lvl = 0

RETURN @empidRETURN @empid

RETURN dbo.ufn_GetAncestor(RETURN dbo.ufn_GetAncestor(

(SELECT mgrid FROM Employees WHERE empid = @empid),(SELECT mgrid FROM Employees WHERE empid = @empid),

@lvl -1)@lvl -1)

ENDEND

Page 22: SQL Server ™  2000: 사용자 정의 함수 하 성희

재귀 호출 – 예제재귀 호출 – 예제SELECT dbo.ufn_GetAncestor(11, 2)SELECT dbo.ufn_GetAncestor(11, 2)

GOGO

SELECT * FROM Employees SELECT * FROM Employees

WHERE empid = dbo.ufn_GetAncestor(11, 2)WHERE empid = dbo.ufn_GetAncestor(11, 2)

GOGO

SELECT E.empname AS employee, SELECT E.empname AS employee,

A.empname AS ancestorA.empname AS ancestor

FROM Employees AS E LEFT OUTER JOIN Employees AS AFROM Employees AS E LEFT OUTER JOIN Employees AS A

ON A.empid = dbo.ufn_GetAncestor(E.empid, 2)ON A.empid = dbo.ufn_GetAncestor(E.empid, 2)

GOGO

Page 23: SQL Server ™  2000: 사용자 정의 함수 하 성희

재귀 호출 예제 재귀 호출 예제 반복문 반복문CREATE FUNCTION dbo.ufn_GetAncestor2CREATE FUNCTION dbo.ufn_GetAncestor2( @empid AS int,( @empid AS int, @lvl AS int = 1 -- @lvl AS int = 1 -- 몇 단계 위 상급자인지 지정몇 단계 위 상급자인지 지정))RETURNS intRETURNS intASASBEGINBEGIN IF @lvl IS NULL or @empid IS NULL or @lvl < 0 IF @lvl IS NULL or @empid IS NULL or @lvl < 0 RETURN NULLRETURN NULL DECLARE @mgrid AS intDECLARE @mgrid AS int SET @mgrid = @empidSET @mgrid = @empid WHILE @lvl > 0 AND @mgrid IS NOT NULLWHILE @lvl > 0 AND @mgrid IS NOT NULL SELECT @mgrid = mgrid, @lvl = @lvl - 1SELECT @mgrid = mgrid, @lvl = @lvl - 1 FROM Employees WHERE empid = @mgridFROM Employees WHERE empid = @mgrid RETURN @mgridRETURN @mgridENDEND

Page 24: SQL Server ™  2000: 사용자 정의 함수 하 성희

활용 예활용 예 UDFUDF 를 지원하게 됨으로써를 지원하게 됨으로써 , , T-SQLT-SQL 이 이

통계 계산 언어로서 보다 강력해졌다통계 계산 언어로서 보다 강력해졌다 .. 통계 업무통계 업무

ClippingClipping HistogramsHistograms Time SeriesTime Series Trend Analysis Trend Analysis

계층 관리 업무계층 관리 업무

Page 25: SQL Server ™  2000: 사용자 정의 함수 하 성희

통계 예제 통계 예제 - - ClippingClipping

CREATE FUNCTION dbo.MiddleTemperatures(@ClipSize int = CREATE FUNCTION dbo.MiddleTemperatures(@ClipSize int = 2)2)

RETURNS TABLERETURNS TABLE

ASAS

RETURN(SELECT v.MiddayTempRETURN(SELECT v.MiddayTemp

FROM tempdb..TemperatureReadings v CROSS JOIN FROM tempdb..TemperatureReadings v CROSS JOIN tempdb..TemperatureReadings atempdb..TemperatureReadings a

GROUP BY v.MiddayTempGROUP BY v.MiddayTemp

HAVING COUNT(CASE WHEN a.MiddayTemp <=v.MiddayTemp HAVING COUNT(CASE WHEN a.MiddayTemp <=v.MiddayTemp THEN 1 ELSE NULL END) > @ClipSizeTHEN 1 ELSE NULL END) > @ClipSize

AND COUNT(CASE WHEN a.MiddayTemp >= v.MiddayTemp AND COUNT(CASE WHEN a.MiddayTemp >= v.MiddayTemp THEN 1 ELSE NULL END) >@ClipSize)THEN 1 ELSE NULL END) >@ClipSize)

GOGO

SELECT * FROM dbo.MiddleTemperatures(2) SELECT * FROM dbo.MiddleTemperatures(2)

ORDER BY MiddayTempORDER BY MiddayTemp

Page 26: SQL Server ™  2000: 사용자 정의 함수 하 성희

통계 예제 통계 예제 - - HistogramHistogramCREATE FUNCTION dbo.SalesHistogram(@payterms varchar(12)='%')CREATE FUNCTION dbo.SalesHistogram(@payterms varchar(12)='%')

RETURNS TABLERETURNS TABLE

ASAS

RETURN(RETURN(

SELECT PayTerms=isnull(s.payterms,'NA'),SELECT PayTerms=isnull(s.payterms,'NA'),

““- 10"=COUNT(CASE WHEN s.sales>=0 AND s.sales<10 THEN 1 ELSE NULL END),- 10"=COUNT(CASE WHEN s.sales>=0 AND s.sales<10 THEN 1 ELSE NULL END),

"10-19"=COUNT(CASE WHEN s.sales>=10 AND s.sales<20 THEN 1 ELSE NULL END), "10-19"=COUNT(CASE WHEN s.sales>=10 AND s.sales<20 THEN 1 ELSE NULL END),

"20-29"=COUNT(CASE WHEN s.sales>=20 AND s.sales<30 THEN 1 ELSE NULL END), "20-29"=COUNT(CASE WHEN s.sales>=20 AND s.sales<30 THEN 1 ELSE NULL END),

"30-39"=COUNT(CASE WHEN s.sales>=30 AND s.sales<40 THEN 1 ELSE NULL END),"30-39"=COUNT(CASE WHEN s.sales>=30 AND s.sales<40 THEN 1 ELSE NULL END),

"40-49"=COUNT(CASE WHEN s.sales>=40 AND s.sales<50 THEN 1 ELSE NULL END),"40-49"=COUNT(CASE WHEN s.sales>=40 AND s.sales<50 THEN 1 ELSE NULL END),

"50 or more"=COUNT(CASE WHEN s.sales >=50 THEN 1 ELSE NULL END)"50 or more"=COUNT(CASE WHEN s.sales >=50 THEN 1 ELSE NULL END)

FROM (SELECT t.title_id, s.payterms, sales=ISNULL(SUM(s.qty),0) FROM FROM (SELECT t.title_id, s.payterms, sales=ISNULL(SUM(s.qty),0) FROM titles t LEFT OUTER JOIN sales s ON (t.title_id=s.title_id) GROUP BY titles t LEFT OUTER JOIN sales s ON (t.title_id=s.title_id) GROUP BY t.title_id, payterms) st.title_id, payterms) s

WHERE s.payterms LIKE @paytermsWHERE s.payterms LIKE @payterms

GROUP BY s.paytermsGROUP BY s.payterms

))

GOGO

SELECT * FROM dbo.SalesHistogram(DEFAULT)SELECT * FROM dbo.SalesHistogram(DEFAULT)

SELECT * FROM dbo.SalesHistogram('Net 30')SELECT * FROM dbo.SalesHistogram('Net 30')

Page 27: SQL Server ™  2000: 사용자 정의 함수 하 성희

계층 관리 예제계층 관리 예제---- 서브 트리의 합계 계산서브 트리의 합계 계산CREATE FUNCTION dbo.ufn_GetSubtreeSalaryCREATE FUNCTION dbo.ufn_GetSubtreeSalary( ( @mgrid AS int@mgrid AS int))RETURNS intRETURNS intASASBEGINBEGINRETURN (SELECT SalaryRETURN (SELECT Salary FROM Employees WHERE empid = @mgrid) +FROM Employees WHERE empid = @mgrid) + CASE WHEN EXISTSCASE WHEN EXISTS (SELECT * FROM Employees WHERE mgrid = @mgrid) THEN(SELECT * FROM Employees WHERE mgrid = @mgrid) THEN (SELECT SUM(dbo.ufn_GetSubtreeSalary(empid))(SELECT SUM(dbo.ufn_GetSubtreeSalary(empid)) FROM EmployeesFROM Employees WHERE mgrid = @mgrid)WHERE mgrid = @mgrid) ELSE 0ELSE 0 ENDENDENDEND

Page 28: SQL Server ™  2000: 사용자 정의 함수 하 성희

계층 관리 예제계층 관리 예제CREATE FUNCTION ufn_GetSubtree ( @mgrid AS int )CREATE FUNCTION ufn_GetSubtree ( @mgrid AS int )RETURNS @tree tableRETURNS @tree table( empid int NOT NULL,( empid int NOT NULL, mgrid int NULL,mgrid int NULL, empname varchar(25) NOT NULL,empname varchar(25) NOT NULL, salary money NOT NULL,salary money NOT NULL, lvl int NOT NULL,lvl int NOT NULL, path varchar(900) NOT NULL )path varchar(900) NOT NULL )ASASBEGINBEGIN DECLARE @lvl AS int, @path AS varchar(900)DECLARE @lvl AS int, @path AS varchar(900) SELECT @lvl = 0, @path = '.'SELECT @lvl = 0, @path = '.' INSERT INTO @tree SELECT empid, mgrid, empname, salary,INSERT INTO @tree SELECT empid, mgrid, empname, salary, @lvl, '.' + CAST(empid AS varchar(10)) + '.'@lvl, '.' + CAST(empid AS varchar(10)) + '.' FROM Employees WHERE empid = @mgridFROM Employees WHERE empid = @mgrid WHILE @@ROWCOUNT > 0 BEGINWHILE @@ROWCOUNT > 0 BEGIN SET @lvl = @lvl + 1SET @lvl = @lvl + 1 INSERT INTO @tree INSERT INTO @tree SELECT E.empid, E.mgrid, E.empname, E.salary,@lvl, T.path + CAST(E.empid AS SELECT E.empid, E.mgrid, E.empname, E.salary,@lvl, T.path + CAST(E.empid AS

varchar(10)) + '.'varchar(10)) + '.' FROM Employees AS E JOIN @tree AS T ON E.mgrid = T.empid AND T.lvl = @lvl - 1FROM Employees AS E JOIN @tree AS T ON E.mgrid = T.empid AND T.lvl = @lvl - 1 END END RETURNRETURNENDEND

Page 29: SQL Server ™  2000: 사용자 정의 함수 하 성희

계층 관리 예제계층 관리 예제SELECT * FROM ufn_GetSubtree(2)SELECT * FROM ufn_GetSubtree(2)

ORDER BY pathORDER BY path

GOGO

SELECT REPLICATE (' | ', lvl) + empname SELECT REPLICATE (' | ', lvl) + empname AS employeeAS employee

FROM ufn_GetSubtree(1)FROM ufn_GetSubtree(1)

ORDER BY pathORDER BY path

GOGO

Page 30: SQL Server ™  2000: 사용자 정의 함수 하 성희

계층 관리 예제계층 관리 예제CREATE FUNCTION ufn_GetMgmtChain ( @empid AS int )CREATE FUNCTION ufn_GetMgmtChain ( @empid AS int )

RETURNS @tree tableRETURNS @tree table

( empid int NOT NULL,( empid int NOT NULL,

mgrid int NULL,mgrid int NULL,

empname varchar(25) NOT NULL,empname varchar(25) NOT NULL,

salary money NOT NULL,salary money NOT NULL,

lvl int NOT NULL )lvl int NOT NULL )

ASAS

BEGINBEGIN

DECLARE @lvl AS intDECLARE @lvl AS int

SET @lvl = 0SET @lvl = 0

INSERT INTO @tree SELECT empid, mgrid, empname, salary, @lvl FROM EmployeesINSERT INTO @tree SELECT empid, mgrid, empname, salary, @lvl FROM Employees

WHERE empid = @empidWHERE empid = @empid

WHILE @@ROWCOUNT > 0 BEGINWHILE @@ROWCOUNT > 0 BEGIN

SET @lvl = @lvl + 1SET @lvl = @lvl + 1

INSERT INTO @tree SELECT E.empid, E.mgrid, E.empname, E.salary, @lvlINSERT INTO @tree SELECT E.empid, E.mgrid, E.empname, E.salary, @lvl

FROM Employees AS E JOIN @tree AS T ON E.empid = T.mgrid AND T.lvl = @lvl - 1FROM Employees AS E JOIN @tree AS T ON E.empid = T.mgrid AND T.lvl = @lvl - 1

END END

RETURNRETURN

ENDEND

GOGO

SELECT * FROM ufn_GetMgmtChain(14) ORDER BY lvl DESCSELECT * FROM ufn_GetMgmtChain(14) ORDER BY lvl DESC

Page 31: SQL Server ™  2000: 사용자 정의 함수 하 성희

UDF UDF 삭제하기삭제하기 DROP FUNCTIONDROP FUNCTION

예예 : : DROP FUNCTION dbo.ProperDROP FUNCTION dbo.Proper 삭제 작업 전 종속성 점검 요망삭제 작업 전 종속성 점검 요망

예예 : : 제약 조건에 사용된 경우 삭제 불가제약 조건에 사용된 경우 삭제 불가 다른 함수다른 함수 , , 뷰뷰 , , 트리거트리거 , , 저장 저장

프로시저에서 사용되는 함수 삭제 프로시저에서 사용되는 함수 삭제 해당 함수 참조 오브젝트 다음 실행 시 해당 함수 참조 오브젝트 다음 실행 시 오류 발생 오류 발생

스키마 바운드와 연관스키마 바운드와 연관

Page 32: SQL Server ™  2000: 사용자 정의 함수 하 성희

종속 관계 확인종속 관계 확인 sp_depends sp_depends

종속 레벨 종속 레벨 11 로 제한적로 제한적 예예 : : exec sp_depends fn_CubicVolume_Mainexec sp_depends fn_CubicVolume_Main

sp_Msdependenciessp_Msdependencies Sp_depends Sp_depends 보다 진보된 보다 진보된 spsp 종속 레벨 제한 없음 종속 레벨 제한 없음 Undocumented stored procedureUndocumented stored procedure Enterprise ManagerEnterprise Manager 에서 사용에서 사용 예예 :: exec sp_MSdependencies exec sp_MSdependencies fn_CubicVolume_Main, null, 0x0411FFfn_CubicVolume_Main, null, 0x0411FF exec sp_MSdependencies exec sp_MSdependencies fn_CubicVolume_Main, null, 0x0011FFfn_CubicVolume_Main, null, 0x0011FF

Page 33: SQL Server ™  2000: 사용자 정의 함수 하 성희

Meta-dataMeta-data

SELECT SELECT

LEFT(name,20) AS [Function],LEFT(name,20) AS [Function],

OBJECTPROPERTY(id,'IsScalarFunction') AS Scalar,OBJECTPROPERTY(id,'IsScalarFunction') AS Scalar,

OBJECTPROPERTY(id,'IsTableFunction') AS [Table],OBJECTPROPERTY(id,'IsTableFunction') AS [Table],

OBJECTPROPERTY(id,'IsInlineFunction') AS Inline,OBJECTPROPERTY(id,'IsInlineFunction') AS Inline,

OBJECTPROPERTY(id,'IsDeterministic') AS Determ,OBJECTPROPERTY(id,'IsDeterministic') AS Determ,

OBJECTPROPERTY(id,'IsSchemaBound') AS SchemaBoundOBJECTPROPERTY(id,'IsSchemaBound') AS SchemaBound

FROM sysobjects FROM sysobjects

WHERE type in ('IF','TF','FN')WHERE type in ('IF','TF','FN')

ORDER BY nameORDER BY name

Page 34: SQL Server ™  2000: 사용자 정의 함수 하 성희

확정성확정성 ((Determinism)Determinism)

확정적 함수가 되기 위한 조건확정적 함수가 되기 위한 조건 :: 동일한 입력 값동일한 입력 값 동일한 결과 값동일한 결과 값

함수를 인덱스된 뷰 또는 인덱스된 함수를 인덱스된 뷰 또는 인덱스된 계산된 컬럼에 사용할 수 있는지를 결정계산된 컬럼에 사용할 수 있는지를 결정

ObjectProperty() ObjectProperty() 함수를 사용하면 함수를 사용하면 함수가 확정적인지 확인할 수 있다함수가 확정적인지 확인할 수 있다

SELECT OBJECTPROPERTYSELECT OBJECTPROPERTY

(OBJECT_ID('fn_CubicVolume'), 'IsDeterministic')(OBJECT_ID('fn_CubicVolume'), 'IsDeterministic')

Page 35: SQL Server ™  2000: 사용자 정의 함수 하 성희

확정적 함수 조건확정적 함수 조건

로컬 로컬 table table 변수를 제외하고 어떤 변수를 제외하고 어떤 테이블도 액세스하지 않는다테이블도 액세스하지 않는다

비확정적 함수를 호출하지 않는다비확정적 함수를 호출하지 않는다 (builtin (builtin 이건 이건 UDFUDF 이건이건 ))

스키마 바운드이다스키마 바운드이다 CREATE FUNCTION CREATE FUNCTION 시점에 자동으로 시점에 자동으로

확정성을 점검한다확정성을 점검한다

Page 36: SQL Server ™  2000: 사용자 정의 함수 하 성희

비확정적 함수비확정적 함수 함수가 스키마 바인드가 아니다함수가 스키마 바인드가 아니다 .. 그 함수가 호출하는 함수 중 적어도 그 함수가 호출하는 함수 중 적어도

하나가 비확정적이다하나가 비확정적이다 .. 그 함수가 함수 범위 밖의 데이터베이스 그 함수가 함수 범위 밖의 데이터베이스

오브젝트를 참조한다오브젝트를 참조한다 .. 그 함수가 확장 저장 프로시저 그 함수가 확장 저장 프로시저 ((extended extended

stored procedure)stored procedure) 를 호출한다를 호출한다 ..

Page 37: SQL Server ™  2000: 사용자 정의 함수 하 성희

시스템 함수 시스템 함수 시스템 함수시스템 함수

모든 데이터베이스에서 데이터베이스 이름 모든 데이터베이스에서 데이터베이스 이름 없이 쿼리 가능없이 쿼리 가능

조건조건 DatabaseDatabase : : master master Owner : system_function_schemaOwner : system_function_schema Name : fnName : fn 으로 시작 으로 시작 & & 소문자소문자 ‘‘allow updates’ = 1allow updates’ = 1

Page 38: SQL Server ™  2000: 사용자 정의 함수 하 성희

시스템 함수 조회시스템 함수 조회USE masterUSE master

GOGO

SELECT nameSELECT name

FROM sysobjectsFROM sysobjects

WHERE uid=USER_ID('system_function_schema')WHERE uid=USER_ID('system_function_schema')

AND (OBJECTPROPERTY(id, 'IsScalarFunction')=1AND (OBJECTPROPERTY(id, 'IsScalarFunction')=1

OR OR

OBJECTPROPERTY(id, 'IsTableFunction')=1OBJECTPROPERTY(id, 'IsTableFunction')=1

OROR OBJECTPROPERTY(id, 'IsInlineFunction')=1) OBJECTPROPERTY(id, 'IsInlineFunction')=1)

GOGO

Page 39: SQL Server ™  2000: 사용자 정의 함수 하 성희

시스템 함수 만들기 시스템 함수 만들기 - - 예제예제USE masterUSE masterGOGOexec sp_configure 'allow updates',1exec sp_configure 'allow updates',1reconfigure with overridereconfigure with overrideGOGOCREATE FUNCTION system_function_schema.fn_greatestCREATE FUNCTION system_function_schema.fn_greatest

(@x bigint, @y bigint)(@x bigint, @y bigint)RETURNS bigintRETURNS bigintASASBEGINBEGIN RETURN (CASE WHEN @x>@y THEN @x ELSE @y END)RETURN (CASE WHEN @x>@y THEN @x ELSE @y END)ENDENDGOGOexec sp_configure 'allow updates',0exec sp_configure 'allow updates',0reconfigure with overridereconfigure with overrideGOGO

Page 40: SQL Server ™  2000: 사용자 정의 함수 하 성희

기본 제공 함수기본 제공 함수

새로운 기본 제공 함수들새로운 기본 제공 함수들 GetUTCDate()GetUTCDate()

현재의 국제 표준시 반환현재의 국제 표준시 반환 SCOPE_IDENTITY()SCOPE_IDENTITY()

같은 범위에서 삽입된 마지막 같은 범위에서 삽입된 마지막 identity identity 값 반환값 반환 IDENT_CURRENT(‘tblname’)IDENT_CURRENT(‘tblname’)

임의의 세션과 범위에서 마지막으로 삽입된 임의의 세션과 범위에서 마지막으로 삽입된 identity identity 값 반환값 반환

Page 41: SQL Server ™  2000: 사용자 정의 함수 하 성희

성능 측면성능 측면 인라인 테이블 값 함수와 다중 명령문 인라인 테이블 값 함수와 다중 명령문

테이블 값 함수 비교테이블 값 함수 비교 대개 인라인 테이블 값 함수가 다중 명령문 대개 인라인 테이블 값 함수가 다중 명령문

테이블 값 함수보다 성능이 좋다테이블 값 함수보다 성능이 좋다 .. 인라인 함수가 인덱스를 보다 효율적으로 인라인 함수가 인덱스를 보다 효율적으로

사용사용 인라인 함수로 가능한 경우에는 인라인 함수 인라인 함수로 가능한 경우에는 인라인 함수

사용 권장사용 권장 읽기 전용 뷰와 인라인 테이블 값 함수읽기 전용 뷰와 인라인 테이블 값 함수

인라인 테이블 값 함수는 매개 변수 사용 인라인 테이블 값 함수는 매개 변수 사용 가능가능

인라인 테이블 값 함수는 맨 처음 실행 시 인라인 테이블 값 함수는 맨 처음 실행 시 최적화되고 컴파일됨 최적화되고 컴파일됨 성능 이득 성능 이득

Page 42: SQL Server ™  2000: 사용자 정의 함수 하 성희

질문 질문 ??