วันพฤหัสบดีที่ 25 ตุลาคม พ.ศ. 2555

การสร้าง Function ใน SQL Server 2008


T-SQL Functions มี 3 แบบ

Scalar : data types ที่คืนค่ากลับมาได้เป็น Text, ntext, image แต่ไม่สนับสนุน timestamp

CREATE FUNCTION dbo.getFac
(
@SID nvarchar(3)
)
RETURNS /* datatype */ nvarchar(120)
AS
BEGIN
declare @name nvarchar(120)
select @name = FacName from Faculty where FacID=@SID 
RETURN /* value */@name
END

การนำไปใช้งาน
SELECT DeptID, DeptName, FacID, dbo.getFac(FacID) AS FacName
FROM Dept



Inline Table-Valued : คืนค่า table data type เป็นเหมือนการนำเอา Scalar Function มาใช้ในการดึงค่าใน table มาแสดง คล้ายๆการสร้าง view เพื่อแสดง report ที่ต้องการได้

CREATE FUNCTION dbo.TableDeptFacName
(
@FacID nvarchar(3)
)
RETURNS TABLE
AS
RETURN 
SELECT DeptID, DeptName, FacID, dbo.getFac(FacID) AS FacName
FROM Dept
WHERE FacID=@FacID

การนำไปใช้งาน
SELECT DeptID, DeptName, FacID, FacName
FROM dbo.TableDeptFacName('002') AS TableDeptFacName_1

002 คือรหัสคณะที่ส่งเข้าไป


Multi-Statement : เป็นการคล้ายการสร้าง temp table ตามที่ต้องการ สามารถ pass parameter เข้าไปได้

CREATE FUNCTION dbo.TableTmpDeptName
(
@FacID nvarchar(3)
)
RETURNS @DeptFacNameTB TABLE ([DeptID] [nvarchar] (4),[DeptName] [nvarchar] (120))
AS
BEGIN
INSERT INTO @DeptFacNameTB
SELECT DeptID,DeptName FROM Dept WHERE FacID=@FacID
DECLARE @cnt INT
SELECT @cnt = COUNT(*) FROM @DeptFacNameTB
IF @cnt = 0
INSERT INTO @DeptFacNameTB (
[DeptID],
[DeptName] )
VALUES ('000','No Department In This Faculty')
RETURN
END

การนำไปใช้งาน
SELECT DeptID, DeptName
FROM dbo.TableTmpDeptName('000') AS TableTmpDeptName_1


** ข้อดีการทำงานทั้งหมดใน function อยู่ใน Database Server ถ้าต้องการแก้ไขใดก็สามารถทำได้ที่ Server

Credit: Theerayuth@My KM

ไม่มีความคิดเห็น:

แสดงความคิดเห็น