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

Slides:



Advertisements
Similar presentations
연천 새둥지마을 체재형 주말농장 준공식 초청장 오시는 길 주제 일시 장소 21C 경기농촌희망심기 2005년 제1기 교육수료마을
Advertisements

SPARCS Wheel Seminar Mango X Sugoi
출석수업 자료 교과서 범위: 제1장-4장.
10월 충북노회 남선교회 순회 헌신예배 묵 도 기 도 성 경 봉 독 특 송 찬 양 설 교 찬양 / 봉헌 봉 헌 기 도
글에 나타난 시대적 사회적 배경을 파악할 수 있다. 배경 지식과 의미 해석의 관련성을 이해할 수 있다.
패널자료 분석
라오디게아 교회의 교훈 본문 계 3: ○라오디게아 교회의 사자에게 편지하라 아멘이시요 충성되고 참된 증인이시요 하나님의 창조의 근본이신 이가 이르시되 15. 내가 네 행위를 아노니 네가 차지도 아니하고 뜨겁지도 아니하도다 네가 차든지 뜨겁든지 하기를 원하노라.
한알Ⅱ「더불어 살기」전국대회 일정표 날짜 시간 7월 26일(목) 7월 27일(금) 7월 28일(토) 7월 29일(일)
2013학년도 전라북도고등학교신입생 입학전형 기본계획
선거관리위원회 위원 공개모집 4차 공고 제4기 선거관리위원회를 구성하는 위원 모집의
2015학년도 1학기 버디 프로그램 오리엔테이션 (목) 16:00.
열왕기하 1장을 읽고 묵상으로 예배를 준비합시다..
오늘의 학습 주제 Ⅱ. 근대 사회의 전개 4. 개항 이후의 경제와 사회 4-1. 열강의 경제 침탈 4-2. 경제적 구국 운동의 전개 4-3. 사회 구조와 의식의 변화 4-4. 생활 모습의 변화.
전도축제 계획서 *일시 : 2013년 4월 21, 28일 주일 (연속 2주)
2009학년도 가톨릭대학교 입학안내.
한국 상속세 및 증여세 과세제도 한국 국세공무원교육원 교 수 최 성 일.
중세시대의 의복 학번 & 이름.
다문화가정의 가정폭력의 문제점 연세대학교 행정대학원 정치행정리더십 2학기 학번 이름 홍 진옥.
이공계의 현실과 미래 제조업 立國 / 이공계 대학생의 미래 준비
신앙의 기초를 세우는 중고등부 1부 대 예 배 : 11 : 00 ~ 12 : 층 본당
신앙의 기초를 세우는 중고등부 1부 대 예 배 : 11 : 00 ~ 12 : 층 본당
◆ 지난주 반별 출석 보기 ◆ 제 56 권 26호 년 6월 26일 반 선생님 친구들 재적 출석 5세 화평 김성희 선생님
第1篇 자치입법 개론.
교직원 성희롱·성폭력·성매매 예방교육 벌교중앙초등학교 박명희
제5장 새로운 거버넌스와 사회복지정책 사회복지정책이 어떤 행위자에 의해 형성되고 집행되는지, 어떤 과정에서 그러한 일들이 이루어지는지, 효과적인 정책을 위해서는 어떤 일들이 필요한지 등을 본 장에서 알아본다 개인들이 생활을 개선하는 가장 효과적인고 궁극적인 방법은 개별적.
임상시험 규정 (최근 변경 사항 중심으로) -QCRC 보수 교육 과정 전달 교육
서울특별시 특별사법경찰 수사 송치서류 유의사항 서울특별시 특별사법경찰과 북부수사팀장 안   진.
특수학교용 아동학대! 제대로 알고 대처합시다..
사회복지현장의 이해 Generalist Social Worker 사회복지입문자기초과정 반포종합사회복지관 김한욱 관장
학교보건 운영의 실제 한천초등학교 이 채 금.
제 출 문 고용노동부 귀중 본 보고서를 ’ ~ ‘ 까지 실시한 “근로감독관 직무분석 및 교육프로그램 개발에 관한 연구”의 최종보고서로 제출합니다  연구기관 : 중앙경영연구소  프로젝트 총괄책임자 : 고병인 대표.
학습센터란? 기도에 관해 배울 수 있는 다양한 학습 코너를 통하여 어린이들이 보다 더 쉽게 기도를 알게 하고, 기도할 수 있게 하며, 기도의 사람으로 변화될 수 있도록 하는 체험학습 프로그램이다. 따라서 주입식이지 않으며 어린이들이 참여할 수 있는 역동적인 프로그램으로.
Digital BibleⅢ 폰속의 성경 디지털 바이블 2008년 12월 ㈜씨엔커뮤니케이션 ㈜씨엔엠브이엔오.
후에 70인역(LXX)을 좇아 영어 성경은 본서의 중심 주제인 “엑소도스”(출애굽기)라 하였다.
성 김대건 피츠버그 한인 성당 그리스도왕 대축일 공지사항
예배에 대하여.
말씀 듣는 시간입니다..
하나님은 영이시니 예배하는 자가 신령과 진정으로 예배할지니라.
지금 나에게 주신 레마인 말씀 히브리서 13장 8절.
예수의 제자들 담당교수 : 김동욱.
Lecture Part IV: Ecclesiology
KAINOS 날마다 더하여지는 Kainos News 이번 주 찬양 20 / 300 – 20개의 셀, 300명의 영혼
예배의 외부적인 틀II - 예배 음악 조광현.
영성기도회 렉시오 디비나와 묵상기도 2.
성인 1부 성경 공부 지도목사: 신정우 목사 부 장: 오중환 집사 2010년. 5월 9일
남북 탑승객 150명을 태운 디젤기관차가 2007년 5월 17일 오전 경의선 철길을 따라 남측 최북단 역인 도라산역 인근 통문을 통과하고 있다. /문산=사진공동취재단.
성경 암송 대회 한일교회 고등부 (일).
천주교 의정부교구 주엽동본당 사목협의회 사목활동 보고서
III. 노동조합과 경영자조직 노동조합의 이데올로기, 역할 및 기능 노동조합의 조직형태 노동조합의 설립과 운영
여수시 MICE 산업 활성화 전략 ( 중간보고 )
1. 단위사업 관리, 예산관리 사업설정 (교직원협의/의견수렴) 정책 사업 학교 정책 사업 등록 사업 기본정보 목표 설정
※과정 수료자에 한하여 수강료의 80~100% 차등 환급함
평생학습중심대학 프로그램 수강지원서 접수안내 오시는 길 관악구&구로구민을 위한 서울대학교 -- 접수 일정 및 방법 안내--
서비스산업의 선진화, 무엇이 필요한가? 김 주 훈 한 국 개 발 연 구 원.
기존에 없던 창업을 하고 싶은데, 누구의 도움을 받아야 할지 모르겠어요
전시회 개요 Ⅰ. 전시명칭 개최기간 개최장소 개최규모 주 최 참 관 객 현 지 파 트 너 General Information
Homeplus 일 家 양 득 프로그램 소개 2015년 12월.
Home Network 유동관.
통신이론 제 1 장 : 신호의 표현 2015 (1학기).
I. 기업과 혁신.
Chapter 4 – 프로그래밍 언어의 구문과 구현 기법

ESOCOM – IPIX 고정IP서비스 제안서 Proposer ㈜이소컴.
화장품 CGMP 한국콜마㈜.
초화류 종자 시장 규모 100억원 이상(추정, 생산액의 10%정도 차지)
COMPUTER ARCHITECTIRE
[ 한옥 실측 ] 1. 약실측 2. 정밀실측 조선건축사사무소.
14. 컴파일러 자동화 도구 스캐너 생성기 파서 생성기 코드 생성의 자동화
A제조용수/B환경관리/C시설관리 ㈜ 에이플러스 코리아
Introduction to Network Security
Presentation transcript:

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

사용자 정의 함수 (UDF) 사용자가 함수를 정의하여 사용 가능 SQL Server 2000에서 추가된 기능 쿼리에서 호출 가능한 다중 명령문 T-SQL 루틴 저장 프로시저의 기능과 뷰의 기능 결합 & flexibility 확장 결과 : 스칼라 값 또는 테이블 값 스키마 바운드로 생성 가능

UDF의 장점 FROM 절에서, 반환된 결과 사용 가능 테이블의 컬럼에 직접 사용 가능 중간 결과 저장 없이 직접 수행 결과 조인 가능 IN 연산자에서 사용 가능 WHERE 절의 서브 쿼리에서 사용 가능 단일 SELECT 문으로 작성할 수 없는 뷰 생성 가능 뷰와 유사하면서 매개 변수 사용 가능 새로운 산술 함수 생성 용이

UDF의 유형 – 반환 값 기준 스칼라 함수 인라인 테이블 값 함수 다중 명령문 테이블 값 함수 단일 값 반환 단일 SELECT 문 결과 / table 값 반환 다중 명령문 테이블 값 함수 다중 명령문 수행 결과 / table 값 반환

스칼라 함수 일반적인 시스템 함수와 같이 쿼리문에서 사용 가능 유의 사항 단일 값을 반환 다중 명령문 Body의 맨 마지막에 Outer BEGIN…END 사용 금지 호출 시 Owner 명시 요 단일 값을 반환 다중 명령문 Body의 맨 마지막에 RETURN <scalar-expression>

스칼라 함수 예제 CREATE FUNCTION dbo.Proper(@Name sysname) RETURNS sysname AS BEGIN DECLARE @len int, @i int, @Outname sysname, @LastSpc bit SET @len=DATALENGTH(@Name) SET @i=1 SET @LastSpc=1 SET @Outname='' WHILE @i<@len BEGIN SET @Outname=@Outname+ CASE @Lastspc WHEN 1 THEN UPPER(SUBSTRING(@Name,@i,1)) ELSE LOWER(SUBSTRING(@Name,@i,1)) END SET @LastSpc=CASE SUBSTRING(@Name,@i,1) WHEN ' ' THEN 1 ELSE 0 END SET @i=@i+1 END RETURN(@Outname) GO SELECT dbo.Proper('ha sunghee') --> 결과 : Ha Sunghee

인라인 테이블 값 함수 단일 SELECT 문으로 구성 예제 RETURN (<select 문>) CREATE FUNCTION SalesByStore(@storid varchar(30)) RETURNS TABLE AS RETURN (SELECT title, qty FROM sales s, titles t WHERE s.stor_id = @storid and t.title_id = s.title_id)

인라인 테이블 값 함수 SELECT 문의 결과를 반환 함수 body가 없다. SELECT 문의 FROM 절에서 사용 가능 “Parameterized View” 기능 다중 명령문 테이블 값 함수와의 주된 차이점 RETURNS 절에 반환 타입을 TABLE 로만 기술 (정의 불필요) 다른 함수 유형과의 차이점 outer BEGIN…END 사용 금지

다중 명령문 테이블 값 함수 Table 데이터 타입을 반환 Header : 반환 table 변수 정의 포함 Body 정의 INSERT, UPDATE, DELETE 들을 조합 사용하여 반환할 변수의 값을 구성 함수의 마지막 부분에서 반환 변수 값을 반환 결과 바로 처리 가능  임시 테이블 사용 대체

다중 명령문 테이블 값 함수 예제 CREATE FUNCTION SalesByStore(@storid varchar(30)) RETURNS @sales TABLE(title varchar(30), qty int) AS BEGIN INSERT @sales SELECT title, qty FROM sales s, titles t WHERE s.stor_id = @storid and t.title_id = s.title_id RETURN END

UDF 작성 시 권장 사항 시스템 함수 활용 복잡한 함수는 보다 단순한 함수들로 분리 모든 행을 반환하는 DEFAULT 사용 자제 예: WHERE name like ‘@value%’  WHERE name like ‘%’

스키마 바운드 함수를 함수가 참조하는 오브젝트에 연결  함수에 영향을 미치는 오브젝트의 변경 방지 SCHEMABINDING 옵션 WITH SCHEMABINDING CREATE FUNCTION, CREATE VIEW ALTER FUNCTION, ALTER VIEW REFERENCES 권한 필요

UDF의 제약 사항 영구 오브젝트 생성 불가 임시 테이블 생성 불가 저장 프로시저 호출 불가 RAISERROR() 호출 불가 Table 변수 사용 저장 프로시저 호출 불가 RAISERROR() 호출 불가 환경 설정 불가 예: SET NOCOUNT ON 호출 시 Four-part name 사용 불가 Remote function 호출 시 오브젝트 이름을 매개 변수로 전달 불가 인라인 함수에서 ORDER BY 사용하려면 TOP 사용 요

UDF: No Side Effects 작업 불가 작업 가능: 테이블에 대한 Update, global cursor statements, DDL, transaction statements 등. 작업 가능: Table 변수에 대한 Update Local cursor statements

Workaround – 원격 함수 호출 1. select testsvr1...calc_interest (10000 , 10 , 1) 2. select * from openquery (testsvr1, 'select dbo.calc_interest (10000 , 10 , 1)') 3. declare @interest int exec testsvr1...sp_executesql N'select @int=dbo.calc_interest(@prin, @rate, @years)', N'@prin int, @rate int, @years int, @int int OUT', 10000, 10, 1, @interest OUT select @interest

Workaround – 저장 프로시저 호출 불가 확장 프로시저 호출 가능 Xp로 시작하는 이름을 가진 확장 함수에 한함 예: sp_executesql 사용 불가 Sp_executesql 대체 확장 프로시저 생성 및 활용

Workaround – 오브젝트 매개 변수화 UDF에서 사용하는 오브젝트들을 매개 변수화 할 수 없다. UDF에서 확장 프로시저는 호출 가능 예제

UDF 호출하기 스칼라 UDF : 최소 2-part name 사용 테이블 값 UDF : 1-part name으로도 가능 예: SELECT dbo.Proper('ha sunghee') 테이블 값 UDF : 1-part name으로도 가능 예: SELECT * FROM SalesByStore('7131') 기본 제공 사용자 정의 함수 1-part name 사용 Table 반환 함수 : 이름에 접두어 fn 추가 예: SELECT * FROM ::fn_helpcollations()

UDF 호출하기 스칼라 UDF는 scalar expression 어디서든 사용 가능 SELECT 리스트, WHERE 절 CHECK 제약 조건 정의 DEFAULT 정의 Table UDF는 FROM 절에서 사용 가능 매개 변수를 완전히 생략할 수는 없음. DEFAULT 예약어 기술 요

재귀 호출 저장 프로시저, 트리거와 같이 UDF도 recursion 지원 제약 사항 Nesting level = 32 무한 루핑 위험 제거 32 초과 가능성 존재 시 방식 변경 요

재귀 호출 - 예제 CREATE FUNCTION dbo.ufn_GetAncestor ( @empid AS int, @lvl AS int = 1 -- 몇 단계 위 상급자인지 지정 ) RETURNS int AS BEGIN IF @lvl IS NULL or @empid IS NULL or @lvl < 0 RETURN NULL IF @lvl = 0 RETURN @empid RETURN dbo.ufn_GetAncestor( (SELECT mgrid FROM Employees WHERE empid = @empid), @lvl -1) END

재귀 호출 – 예제 SELECT dbo.ufn_GetAncestor(11, 2) GO SELECT * FROM Employees WHERE empid = dbo.ufn_GetAncestor(11, 2) SELECT E.empname AS employee, A.empname AS ancestor FROM Employees AS E LEFT OUTER JOIN Employees AS A ON A.empid = dbo.ufn_GetAncestor(E.empid, 2)

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

활용 예 UDF를 지원하게 됨으로써, T-SQL이 통계 계산 언어로서 보다 강력해졌다. 통계 업무 계층 관리 업무 Clipping Histograms Time Series Trend Analysis 계층 관리 업무

통계 예제 - Clipping CREATE FUNCTION dbo.MiddleTemperatures(@ClipSize int = 2) RETURNS TABLE AS RETURN(SELECT v.MiddayTemp FROM tempdb..TemperatureReadings v CROSS JOIN tempdb..TemperatureReadings a GROUP BY v.MiddayTemp HAVING COUNT(CASE WHEN a.MiddayTemp <=v.MiddayTemp THEN 1 ELSE NULL END) > @ClipSize AND COUNT(CASE WHEN a.MiddayTemp >= v.MiddayTemp THEN 1 ELSE NULL END) >@ClipSize) GO SELECT * FROM dbo.MiddleTemperatures(2) ORDER BY MiddayTemp

통계 예제 - Histogram CREATE FUNCTION dbo.SalesHistogram(@payterms varchar(12)='%') RETURNS TABLE AS RETURN( SELECT PayTerms=isnull(s.payterms,'NA'), “- 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), "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), "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) 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 t.title_id, payterms) s WHERE s.payterms LIKE @payterms GROUP BY s.payterms ) GO SELECT * FROM dbo.SalesHistogram(DEFAULT) SELECT * FROM dbo.SalesHistogram('Net 30')

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

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

계층 관리 예제 SELECT * FROM ufn_GetSubtree(2) ORDER BY path GO SELECT REPLICATE (' | ', lvl) + empname AS employee FROM ufn_GetSubtree(1)

계층 관리 예제 CREATE FUNCTION ufn_GetMgmtChain ( @empid AS int ) RETURNS @tree table ( empid int NOT NULL, mgrid int NULL, empname varchar(25) NOT NULL, salary money NOT NULL, lvl int NOT NULL ) AS BEGIN DECLARE @lvl AS int SET @lvl = 0 INSERT INTO @tree SELECT empid, mgrid, empname, salary, @lvl FROM Employees WHERE empid = @empid WHILE @@ROWCOUNT > 0 BEGIN SET @lvl = @lvl + 1 INSERT 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 - 1 END RETURN GO SELECT * FROM ufn_GetMgmtChain(14) ORDER BY lvl DESC

UDF 삭제하기 DROP FUNCTION 삭제 작업 전 종속성 점검 요망 예: DROP FUNCTION dbo.Proper 예: 제약 조건에 사용된 경우 삭제 불가 다른 함수, 뷰, 트리거, 저장 프로시저에서 사용되는 함수 삭제  해당 함수 참조 오브젝트 다음 실행 시 오류 발생 스키마 바운드와 연관

종속 관계 확인 sp_depends sp_Msdependencies 종속 레벨 1로 제한적 예: exec sp_depends fn_CubicVolume_Main sp_Msdependencies Sp_depends 보다 진보된 sp 종속 레벨 제한 없음 Undocumented stored procedure Enterprise Manager에서 사용 예: exec sp_MSdependencies fn_CubicVolume_Main, null, 0x0411FF fn_CubicVolume_Main, null, 0x0011FF

Meta-data SELECT LEFT(name,20) AS [Function], OBJECTPROPERTY(id,'IsScalarFunction') AS Scalar, OBJECTPROPERTY(id,'IsTableFunction') AS [Table], OBJECTPROPERTY(id,'IsInlineFunction') AS Inline, OBJECTPROPERTY(id,'IsDeterministic') AS Determ, OBJECTPROPERTY(id,'IsSchemaBound') AS SchemaBound FROM sysobjects WHERE type in ('IF','TF','FN') ORDER BY name

확정성(Determinism) 확정적 함수가 되기 위한 조건: 동일한 입력 값  동일한 결과 값 함수를 인덱스된 뷰 또는 인덱스된 계산된 컬럼에 사용할 수 있는지를 결정 ObjectProperty() 함수를 사용하면 함수가 확정적인지 확인할 수 있다 SELECT OBJECTPROPERTY (OBJECT_ID('fn_CubicVolume'), 'IsDeterministic')

확정적 함수 조건 로컬 table 변수를 제외하고 어떤 테이블도 액세스하지 않는다 비확정적 함수를 호출하지 않는다 (builtin 이건 UDF이건) 스키마 바운드이다 CREATE FUNCTION 시점에 자동으로 확정성을 점검한다

비확정적 함수 함수가 스키마 바인드가 아니다. 그 함수가 호출하는 함수 중 적어도 하나가 비확정적이다. 그 함수가 함수 범위 밖의 데이터베이스 오브젝트를 참조한다. 그 함수가 확장 저장 프로시저 (extended stored procedure)를 호출한다.

시스템 함수 시스템 함수 조건 모든 데이터베이스에서 데이터베이스 이름 없이 쿼리 가능 Database : master Owner : system_function_schema Name : fn으로 시작 & 소문자 ‘allow updates’ = 1

시스템 함수 조회 USE master GO SELECT name FROM sysobjects WHERE uid=USER_ID('system_function_schema') AND (OBJECTPROPERTY(id, 'IsScalarFunction')=1 OR OBJECTPROPERTY(id, 'IsTableFunction')=1 OR OBJECTPROPERTY(id, 'IsInlineFunction')=1)

시스템 함수 만들기 - 예제 USE master GO exec sp_configure 'allow updates',1 reconfigure with override CREATE FUNCTION system_function_schema.fn_greatest (@x bigint, @y bigint) RETURNS bigint AS BEGIN RETURN (CASE WHEN @x>@y THEN @x ELSE @y END) END exec sp_configure 'allow updates',0

기본 제공 함수 새로운 기본 제공 함수들 GetUTCDate() SCOPE_IDENTITY() 현재의 국제 표준시 반환 SCOPE_IDENTITY() 같은 범위에서 삽입된 마지막 identity 값 반환 IDENT_CURRENT(‘tblname’) 임의의 세션과 범위에서 마지막으로 삽입된 identity 값 반환

성능 측면 인라인 테이블 값 함수와 다중 명령문 테이블 값 함수 비교 읽기 전용 뷰와 인라인 테이블 값 함수 대개 인라인 테이블 값 함수가 다중 명령문 테이블 값 함수보다 성능이 좋다. 인라인 함수가 인덱스를 보다 효율적으로 사용 인라인 함수로 가능한 경우에는 인라인 함수 사용 권장 읽기 전용 뷰와 인라인 테이블 값 함수 인라인 테이블 값 함수는 매개 변수 사용 가능 인라인 테이블 값 함수는 맨 처음 실행 시 최적화되고 컴파일됨  성능 이득

질문 ?