Use northwind
select *
from :: fn_helpcollations()
-- 어떤 테이블의 날짜 간격을 조사 하는 UDF이다.
-- 스칼라 값을 리턴하는 함수이다
-- 스칼라 값이란 단순히 어떤 하나의 값을 리턴하는 형식을 말한다.
Create Function fnDateGap(
@OrderDate Datetime,
@RequireDate Datetime
) Returns int
as
Begin
Return DateDiff(dd, @OrderDate, @RequireDate)
/* 두 인자 사이의 날자의 Gap을 dd 형식으로 반환한다.*/
End
-- 사용은 아래와 같이 할수 있다.
Select OrderDate, RequiredDate,
dbo.fnDateGap(OrderDate, RequiredDate) as DateGapDay
From Orders
--Where절에서도 사용 가능 하다.
Where dbo.fnDateGap(OrderDate, RequiredDate) > 40
sp_depends fnDateGap --이 함수에 대한 의존성을 검사할수 있다.
--아래 예는 다중 테이블 문이다
Create Function LargeOrderShippers
(
@FreightParm money --받을 인자값이다.
)
Returns @OrderShipperTab Table --Returns할 값의 형식이 테이블 형식이다.
(
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,Orders as O
where S.ShipperID=O.ShipVia
and O.Freight > @FreightParm
-- 넘어온 파라미터 값보다 큰 정보들을 @OrderShipperTab 에 저장하였다.
Return
End
Select * from LargeOrderShippers($500)
--위를 실행하면 어떤 테이블 형식을 볼수 있을 것이다.
--함수 자제가 테이블 형식을 리턴한다
--해서 테이블 대신 함수와 인자를 적으면 그 값이 임시테이블(?)에 저장 되는 것이다.
--여기서 임시 테이블이라는 얘기를 했는데.. 우리가 알고 있는 임시테이블(예: #table, ##table)와는
--다른 값이며 임시 테이블 보다는 속도가 빠르다.
--정확한 명칭은 테이블 변수이다.
--테이블 변수는 컴파일의 오버헤드가 없고 그 모듈만 존재한다.
--테이블 변수는 색인을 만들수 없다(기본키, Unique 는 제외)
--그럼 마지막으로 인라인테이블을 리턴하는 Function을 실행해 보자.
Use pubs
go
Create Function SalesByStore(@StoreID varchar(30))
Returns Table --리턴 형식이 그냥 Table 이다.
as
Return(Select title, qty
From Sales s, titles t
Where s.stor_id=@storeid and t.title_id=s.title_id)
--그리고 아래를 실행하면 두개의 레코드를 리턴하게 된다.
select * from SalesByStore('6380')
/*
Returns Table 이라고만 적는다.
Begin/End 가 없다.
Return 에서 테이블에 들어갈 내용을 뷰와 같은 방법으로 적어 준다.
*/