Function - Putra Pandu A (Hikaru Yuuki) のブログ

advertisement
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);
Download