Computer Science, University of Brawijaya Putra Pandu Adikara, S.Kom Function Basis Data 2 Function 3 macam function Rowset function • Fungsi ini mengembalikan sebuah objek yang dapat digunakan sebagai table reference dalam statement TSQL Aggregate function • Fungsi ini beroperasi dari sejumlah nilai tapi menghasilkan nilai ringkas, tunggal. Scalar function • Fungsi ini mengoperasikan suatu nilai dan menghasilkan nilai tunggal Rowset Function CONTAINSTABLE untuk full text searching yg mengembalikan nilai relevansi ranking (RANK) berdasarkan ketepatan atau fuzzy (kurang ketepatan) yang cocok ke kata atau frasa tunggal FREETEXTTABLE untuk full text searching berdasarkan makna bukan kata OPENDATASOURCE untuk membuat koneksi datasource tanpa menggunakan nama linked server OPENQUERY untuk mengakses dan meng-query pada linked server Misal mengakses dan meng-query database Oracle (yang telah dibuat linked server) menggunakan OLE DB OPENROWSET untuk mengakses table di linked server, remote data menggunakan semua informasi koneksi OLE DB Misalnya mengakses dan meng-query file database access,excel lewat TSQL OPENXML untuk mengakses data pada XML CONTAINSTABLE USE Northwind GO SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE(Categories, Description, 'ISABOUT (breads weight (.8), fish weight (.4), beers weight (.2) )' ) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC GO FREETEXTTABLE USE Northwind SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN FREETEXTTABLE(Categories, Description, 'sweetest candy bread and dry meat') AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] GO OPENDATASOURCE SELECT * FROM OPENDATASOURCE( 'SQLOLEDB', 'Data Source=ServerName;User ID=MyUID;Password=MyPass' ).Northwind.dbo.Categories OPENQUERY EXEC sp_addlinkedserver 'OracleSvr', 'Oracle 7.3', 'MSDAORA', 'ORCLDB' GO SELECT * FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') GO OPENROWSET USE pubs GO SELECT a.* FROM OPENROWSET('MSDASQL', 'DRIVER={SQL Server};SERVER=seattle1;UID=manager;PWD=My Pass', pubs.dbo.authors) AS a ORDER BY a.au_lname, a.au_fname GO OPENXML DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> </Order> </Customer> <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/> </Order> </Customer> </ROOT>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT * FROM OPENXML (@idoc, '/ROOT/Customer',1) WITH (CustomerID varchar(10), ContactName varchar(20)) Aggregate Function Fungsi Aggregate hanya diperbolehkan sebagai ekspresi di: Pada statemen SELECT (baik subquery atau outer query). Pada klausa COMPUTE atau COMPUTE BY. Pada klausa HAVING. Antara lain: BINARY_CHECKSUM, CHECKSUM, CHECKSUM_AGG COUNT, COUNT_BIG GROUPING AVG , MAX, MIN, SUM, STDEV,STDEVP, VAR, VARP Scalar Function Configuration Functions Returns information about the current configuration. Cursor Functions Returns information about cursors. Date and Time Functions Performs an operation on a date and time input value and returns either a string, numeric, or date and time value. Mathematical Functions Performs a calculation based on input values provided as parameters to the function, and returns a numeric value. Metadata Functions Returns information about the database and database objects. Security Functions Returns information about users and roles. String Functions Performs an operation on a string (char or varchar) input value and returns a string or numeric value. System Functions Performs operations and returns information about values, objects, and settings in Microsoft® SQL Server™. System Statistical Functions Returns statistical information about the system. Text and Image Functions Performs an operation on a text or image input values or column, and returns information about the value. Function Berdasarkan hasilnya Deterministic selalu menghasilkan nilai yang sama tiap kali dipanggil dengan nilai input tertentu • Semua fungsi built-in aggregate dan string deterministic (kecuali CHARINDEX atau PATINDEX) • Contoh: SIN, COS, FLOOR, ISNULL, POWER, DAY, MONTH, YEAR, Non Deterministic bisa menghasilkan nilai yang berbeda tiap kali dipanggil dengan nilai input tertentu • Semua fungsi configuration, cursor, metadata, security, sistem statistik • Contoh: @@ERROR, GETDATE, IDENTITY, DATENAME, USER_NAME Determinisme Fungsi Determinisme fungsi menentukan apakah mereka dapat digunakan dalam computed column dan indexed view. Indeks harus selalu menghasilkan hasil yang konsisten. Jadi, hanya fungsi deterministik yg dapat digunakan untuk mendefinisikan computed column dan view yang diindeks. User Defined Function (UDF) User Defined Function Fungsi yang dibuat user, berupa routine menggunakan TSQL atau CLR (Common Language Runtime) yang menerima parameter, melakukan aksi seperti kalkulasi kompleks, dan menghasilkan nilai balik. Nilai balik dapat berupa nilai skalar (besaran tunggal) atau sebuah tabel UDF dapat digunakan: Dalam klausa SELECT Dalam pendefinisian UDF lain Untuk CHECK Constraint Untuk mendefinisikan sebuah kolom Untuk menggantikan Stored Procedure Meningkatkan fungsionalitas Indexed View Deklarasi Fungsi Syntax singkat: CREATE FUNCTION nama_fungsi [@parameter] RETURNS tipe_data_hasil_balik BEGIN badan_fungsi RETURN nilai/variable scalar END Contoh Fungsi Contoh: CREATE FUNCTION Tambah(@a INT,@b INT) RETURNS INT BEGIN RETURN @a+@b END Contoh Fungsi: Kalkulasi ISO Week USE AdventureWorks2008R2; GO IF OBJECT_ID (N'dbo.ISOweek', N'FN') IS NOT NULL DROP FUNCTION dbo.ISOweek; GO CREATE FUNCTION dbo.ISOweek (@DATE datetime) RETURNS int WITH EXECUTE AS CALLER AS BEGIN DECLARE @ISOweek int; SET @ISOweek= DATEPART(wk,@DATE)+1-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104'); IF (@ISOweek=0) SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1; IF ((DATEPART(mm,@DATE)=12) AND ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28)) SET @ISOweek=1; RETURN(@ISOweek); END; GO SET DATEFIRST 1; SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week'; Contoh Fungsi: Hasil Balik Berupa Table USE AdventureWorks2008R2; GO IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS RETURN ( SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total' FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID WHERE C.StoreID = @storeid GROUP BY P.ProductID, P.Name ); GO SELECT * FROM Sales.ufn_SalesByStore (602);