SQL Server :: Transact– SQL #2

50
SQL Server :: Transact–SQL #2 Laboratorium Perancangan/Pemrograman Basis Data Komposisi oleh Budi Prayitno April 2012 Batam

description

Laboratorium Perancangan / Pemrograman Basis Data Komposisi oleh Budi Prayitno April 2012 Batam. SQL Server :: Transact– SQL #2. SYNONYM. SYNONYM adalah objek basis data yang berfungsi sebagai nama alternatif/alias terhadap objek basis data lain. Syntax CREATE SYNONYM. - PowerPoint PPT Presentation

Transcript of SQL Server :: Transact– SQL #2

SQL Server :: Transact–SQL #2

Laboratorium Perancangan/Pemrograman Basis DataKomposisi oleh Budi PrayitnoApril 2012Batam

SYNONYM

SYNONYM adalah objek basis data yang berfungsi sebagai nama alternatif/alias terhadap objek basis data lain

Syntax CREATE SYNONYM

CREATE SYNONYM [ schema_name_1. ] synonym_nameFOR <object>

CREATE SYNONYM

USE tempdb;GOCREATE SYNONYM MyProductFOR Production.Product;GO

Pemanggilan SYNONYM

USE tempdb;GOSELECT ProductID, Name FROM MyProductWHERE ProductID < 5;GO

VIEW

View adalah objek basis data yang merupakan representasi logis sebagian atau keseluruhan data [SELECT] yang berasal dari satu atau beberapa table [FROM] berdasarkan kriteria tertentu [WHERE]

Syntax CREATE VIEW

CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]

[ WITH <view_attribute> [ ,...n ] ] AS select_statement [ ; ][ WITH CHECK OPTION ]

WITH CHECK OPTION digunakan untuk memastikan bahwa DML statement yang dieksekusi terhadap VIEW memenuhi kriteria yang ditentukan dalam SELECT statement

CREATE VIEW

USE AdventureWorks ;GOIF OBJECT_ID ('hiredate_view', 'view') IS NOT NULLDROP VIEW hiredate_view ;GOCREATE VIEW hiredate_viewAS SELECT c.FirstName, c.LastName, e.EmployeeID, e.HireDateFROM HumanResources.Employee eJOIN Person.Contact c on e.ContactID = c.ContactID ;GO

Pemanggilan VIEW

SELECT hiredate_view hvWHERE hv. EmployeeID = ‘101’

SEQUENCE

SEQUENCE adalah objek basis data yang berfungsi sebagai generator tipe data INTEGER [serta DECIMAL dan NUMERIC tertentu]

CREATE SEQUENCE Syntax

CREATE SEQUENCE [schema_name . ] sequence_name [ AS [ built_in_integer_type | user-defined_integer_type ] ] [ START WITH <constant> ] [ INCREMENT BY <constant> ] [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ] [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ] [ CYCLE | { NO CYCLE } ] [ { CACHE [ <constant> ] } | { NO CACHE } ] [ ; ]

Tipe Data SEQUENCE

TINYINT [0 .. 255] SMALLINT [-32768 .. 32767] INT [-2147483648 .. 2147483647] BIGINT [-9223372036854775808 ..

9223372036854775807] DECIMAL dan NUMERIC dengan scale 0. Tipe data user-defined yang berbasis tipe data di atas

CREATE SEQUENCE

CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE;

Pemanggilan SEQUENCE

SELECT NEXT VALUE FOR Test.DecSeq;

TRIGGER

TRIGGER adalah objek basis data yang melakukan intersepsi terhadap eksekusi sebuah DML/DDL statement dan melakukan aksi tertentu terkait atau tidak terkait dengan DML/DDL yang diintersepsi tersebut

TRIGGER untuk DML diimplementasikan pada INSERT, UPDATE atau DELETE statement terhadap TABLE atau VIEW

TRIGGER untuk DDL diimplementasikan pada CREATE, ALTER, DROP, GRANT, DENY, REVOKE atau UPDATE STATISTICS statement

TRIGGER, Lebih Lanjut

CREATE TRIGGER, untuk DML #1

CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method

specifier [ ; ] > }

CREATE TRIGGER, untuk DML #2

CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader

AFTER INSERT ASIF EXISTS (SELECT * FROM Purchasing.PurchaseOrderHeader p JOIN Purchasing.Vendor AS v ON v.BusinessEntityID = p.VendorID WHERE v.CreditRating = 5)BEGINRAISERROR ('A vendor''s credit rating is too low.', 16, 1);ROLLBACK TRANSACTION;RETURN END;GO

CREATE TRIGGER, untuk DML #3

CREATE TRIGGER tr_iud_t ON dbo.tAFTER INSERT, UPDATE, DELETE

AS BEGINIF @@ROWCOUNT = 0 RETURN;SELECT i.Id AS [Inserted], i.DataValue AS [NewValue],

d.Id AS [Deleted], d.DataValue AS [OldValue]FROM inserted iFULL OUTER JOIN deleted d ON i.Id = d.Id

END;GO

CREATE TRIGGER, untuk DML #4

CREATE TRIGGER Trig_Amt_UpdON TXNMasterFOR UPDATEAS BEGIN

UPDATE mSET AMOUNT = b.AMOUNTFROM TXNMaster m

INNER JOIN inserted a ON m.ID = a.IDINNER JOIN deleted b ON m.ID = a.ID

WHERE a.AMOUNT > b.AMOUNTEND

Pemanggilan TRIGGER, DML

INSERT INTO PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,

VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)

VALUES (2,3,261,1652,4,GETDATE(),GETDATE(),44594.55,3567.564,1114.8638 );GO

CREATE TRIGGER untuk DDL #1

CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH <ddl_trigger_option> [ ,...n ] ]{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method

specifier > [ ; ] }

CREATE TRIGGER untuk DDL #2

CREATE TRIGGER safety ON DATABASE FOR DROP_SYNONYMAS PRINT 'You must disable Trigger "safety" to drop synonyms!' ROLLBACKGO

INDEX

INDEX adalah objek basis data yang berisi indeks sebuah TABLE

INDEX digunakan untuk meningkatkan performa SELECT statement tertentu

CREATE INDEX

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ][ ; ]

Contoh #1 CREATE INDEX

USE AdventureWorks;GOIF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ProductVendor_VendorID') DROP INDEX IX_ProductVendor_VendorID ON

Purchasing.ProductVendor;GOCREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (VendorID); GO

Contoh #2 CREATE INDEX

USE AdventureWorksGOIF EXISTS (SELECT name FROM sys.indexes WHERE name =

N'IX_SalesPerson_SalesQuota_SalesYTD') DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON

Sales.SalesPerson ;GOCREATE NONCLUSTERED INDEX

IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);GO

Contoh #3 CREATE UNIQUE INDEX

USE AdventureWorks;GOIF EXISTS (SELECT name from sys.indexes WHERE name = N'AK_UnitMeasure_Name') DROP INDEX AK_UnitMeasure_Name ON

Production.UnitMeasure;GOCREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name);GO

Contoh #4 CREATE INDEX

CREATE VIEW Sales.vOrdersWITH SCHEMABINDINGAS SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS

Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS

o WHERE od.SalesOrderID = o.SalesOrderID GROUP BY OrderDate, ProductID;GO--Create an index on the view.CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON Sales.vOrders (OrderDate, ProductID);

FUNCTION

FUNCTION adalah Transact-SQL atau CLR routine yang mengembalikan sebuah nilai

FUNCTION user-defined tidak dapat digunakan untuk melakukan perubahan terhadap basis data

FUNCTION, Lebih Lanjut

Scalar Function Inline Table–valued function Multistatement Table–valued function Common Language Runtime [CLR] Function

Scalar FUNCTION

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ]

parameter_data_type [ = default ] } [ ,...n ] ] )RETURNS return_data_type [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END[ ; ]

CREATE Scalar FUNCTION

CREATE FUNCTION ScalarTrim(@StrToTrim NVARCHAR(200))RETURNS NVARCHAR (200) AS BEGIN RETURN LTRIM (RTRIM (@StrToTrim)) END GO

Pemanggilan Scalar FUNCTION

SELECT LTRIM (RTRIM (TEXTCol)) FROM FunctionTest

SELECT dbo.ScalarTrim (TEXTCol) FROM FunctionTest

Inline Table–Valued FUNCTION

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ]

parameter_data_type [ = default ] } [ ,...n ] ])RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ][ ; ]

CREATE ITV FUNCTION

CREATE FUNCTION GetUnshippedOrders () RETURNS TABLE AS RETURN SELECT a.SaleId, a.CustomerID, b.Qty FROM Sales.Sales aINNER JOIN Sales.SaleDetail b ON a.SaleId = b.SaleIdINNER JOIN Production.Product c ON b.ProductID = c.ProductID WHERE a.ShipDate IS NULL GO

SELECT * FROM dbo.GetUnshippedOrders ()

ITV untuk Scalar

CREATE FUNCTION ITVLTrimR(@StrToTrim NVARCHAR(200))RETURNS TABLE AS RETURN (SELECT LTRIM(RTRIM(@StrToTrim)) AS Trimmed) GO

ITV untuk Scalar

SELECT LTRIM (RTRIM (Column_Name)) FROM Table_Name

SELECT dbo. TVFTrim (TEXTCol) FROM Table_Name

SELECT Trm.Trimmed FROM Table_Name TblNmCROSS APPLY dbo. ITVLTrimR (TblNm.Column_Name) AS

Trm

Scalar untuk ITV

CREATE FUNCTION GIS_Get_Lat (@City VARCHAR(30),    @State CHAR(2))

RETURNS INT WITH EXECUTE AS CALLER

ASBEGIN

DECLARE @LAT INT   SET @LAT = (

SELECT TOP 1 Lattitude FROM GIS_Location WHERE State = @State AND City = @City) RETURN @LAT

END

MS Table–valued FUNCTION

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ]

parameter_data_type [ = default ] } [ ,...n ] ] )RETURNS @return_variable TABLE < table_type_definition > [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN END[ ; ]

CREATE MSTV FUNCTION #1

CREATE FUNCTION MyNS.GetLastShipped(@CustomerID INT)RETURNS @CustomerOrder TABLE (SaleOrderID INT NOT

NULL, CustomerID INT NOT NULL, OrderDate DATETIME NOT

NULL, OrderQty INT NOT NULL) AS BEGIN DECLARE @MaxDate DATETIME SELECT @MaxDate = MAX(OrderDate) FROM Sales.SalesOrderHeader WHERE CustomerID = @CustomerID

CREATE MSTV FUNCTION #2

INSERT @CustomerOrder SELECT a.SalesOrderID, a.CustomerID, a.OrderDate,

b.OrderQty FROM Sales.SalesOrderHeader aINNER JOIN Sales.SalesOrderHeader b ON a.SalesOrderID = b.SalesOrderIDINNER JOIN Production.Product c ON b.ProductID = c.ProductID WHERE a.OrderDate = @MaxDate AND a.CustomerID = @CustomerID RETURN END GO

CLR FUNCTION

CREATE FUNCTION [ schema_name. ] function_name ( { @parameter_name [AS] [ type_schema_name. ]

parameter_data_type [ = default ] } [ ,...n ])RETURNS { return_data_type | TABLE

<clr_table_type_definition> } [ WITH <clr_function_option> [ ,...n ] ] [ AS ] EXTERNAL NAME <method_specifier>[ ; ]

PROCEDURE

Procedure adalah koleksi Transact-SQL statement [atau referensi ke CLR method Microsoft .NET Framework] yang disimpan sebagai objek basis data serta dapat menerima dan mengembalikan parameter dari dan kepada pengguna

CREATE PROCEDURE

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]

[ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] [ WITH <procedure_option> [ ,...n ][ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] | <method_specifier> }[;]<procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE_AS_Clause ]

PROCEDURE, Contoh #1

CREATE PROCEDURE GetAllLoc AS SELECT LOC.CITY, COU.COUNTRY_NAME FROM LOCATIONS LOC JOIN COUNTRIES COU ON LOC.COUNTRY_ID = COU.COUNTRY_ID

GetAllLoc -- Hanya untuk statement pertama dalam batch

EXECUTE GetAllLoc

EXEC GetAllLoc

PROCEDURE, Contoh #2

CREATE PROCEDURE GetEmpByName @lastname varchar(40), @firstname varchar(20)

AS SELECT EMP.FIRST_NAME + ' ' + EMP.LAST_NAME

EMPLOYEE_NAME, DEP.DEPARTMENT_NAME FROM EMPLOYEES EMP JOIN DEPARTMENTS DEP ON EMP.DEPARTMENT_ID = DEP.DEPARTMENT_ID AND EMP.FIRST_NAME = @firstname AND EMP.LAST_NAME = @lastname

PROCEDURE, Pemanggilan #2

GetEmpByName @firstname = 'Steven', @lastname = 'King'

EXECUTE GetEmpByName @firstname = 'Steven', @lastname = 'King'

EXECUTE GetEmpByName @lastname = 'King', @firstname = 'Steven'

EXEC GetEmpByName @firstname = 'Steven', @lastname = 'King'

EXEC GetEmpByName @lastname = 'King', @firstname = 'Steven'

PROCEDURE, Contoh #3

CREATE PROCEDURE GetEmpBySalary @minsalary INT, @maxsalary INT, @avgsalary INT OUTPUT, @actualavgsalary INT OUTASSELECT EMP.FIRST_NAME + ' ' + EMP.LAST_NAME

EMPLOYEE_NAME,EMP.SALARY FROM EMPLOYEES EMP WHERE EMP.SALARY BETWEEN @minsalary AND @maxsalary; SET @actualavgsalary = (SELECT AVG (EMP.SALARY) FROM EMPLOYEES EMP WHERE EMP.SALARY BETWEEN @minsalary AND @maxsalary); SET @avgsalary = (@minsalary + @maxsalary) / 2;

PROCEDURE, Pemanggilan #3

DECLARE @avgsalary INT, @actualavgsalary INT EXECUTE GetEmpBySalary 5000, 10000, @avgsalary OUT,

@actualavgsalary OUTPUT BEGIN PRINT 'These Employees share actual average salary of '+

RTRIM (CAST (@actualavgsalary AS varchar(20))) +' meanwhile the average for input parameters is ' + RTRIM (CAST (@avgsalary AS varchar(20))) + '.'

END