TSQL Enhancement in SQL Server 2008
Meski sepertinya sudah banyak yang tahu bahwa produk terbaru dari microsoft yaitu SQL Server 2008 memiliki kehandalan dalam menangani data dalam skala enterprise, namun tidak ada salahnya kita sedikit perhatikan perubahan mendasar dalam hal Syntax TSQL yang terbaru di SQL Server 2008 ini.
Beberapa fitur yang sangat membantu developer dalam hal kemudahan melakukan scripting di database diantaranya adalah adanya type data baru dan perintah SQL baru yang banyak membantu database developer khususnya bagi mereka yang memiliki latar belakang dari programming
Berikut beberapa Enhancement dari TSQL di SQL Server 2008
A. TSQL "Delighters"
terdapat kemampuan untuk melakukan perintah berikut dalam script TSQL di SQL 2008
DECLARE @t int = 5; -- ini tidak bisa dilakukan di versi sebelumnya
INSERT dbo.myT
VALUES (‘WA’, @t), (‘FL’, @t+1); --ini tidak bisa dilakukan di versi sebelumnya
UPDATE dbo.myT
SET instances+=1; --ini tidak bisa dilakukan di versi sebelumnya
B. Table Value Parameter
Memungkinkan kita untuk mengirimkan para meter data berupa table, yang bisa mengurangi rountrip dalam proses pengiriman data dari aplikasi ke server, karena bisa dilakukan dalam 1 kali pemanggilan SP
create proc ins_data (@t table (a int)) as … -- Declarasi SP seperti ini tidak bisa dilakukan pada versi sebelumnya
Berikut contoh implementasi Table value paramenter
USE AdventureWorks
GO
-- Declarasikan Table Value type EmployeeTable
CREATE TYPE EmployeeTableType AS TABLE
(EmpID INT, EmpName nvarchar(100), EmpEmail nvarchar(100))
USE AdventureWorks
GO
-- Buat Procedure yang menggunakan Parameter dengan type EmployeeTableType
CREATE PROCEDURE NewEmployee(@EmployeeDetails EmployeeTableType READONLY)
As
BEGIN
INSERT INTO dbo.Employee
SELECT * FROM @EmployeeDetails
END
-- Simpan data di table value type
use AdventureWorks
Go
DECLARE @NewEmployees EmployeeTableType
INSERT INTO @NewEmployees
VALUES(1,'John McLean','JohnMcLean@contoso.com')
INSERT INTO @NewEmployees
VALUES(2,'Bob Smith','BobSmith@contoso.com')
INSERT INTO @NewEmployees
VALUES(3,'Ted Connery','TedConnery@contoso.com')
--- Panggil SP
EXECUTE NewEmployee @NewEmployees
C. MERGE Statement
Merge di gunakan untuk menangani proses UPSERT (UPDATE or INSERT) terhadap suatu table, perintah ini menyederhanakan perintah IF Exist yang selama ini di gunakan untuk melakukan syncronisasi data. skenario umumnya jika data sudah ada maka akan di update diantaranya
berikut Syntax MERGE Statement
[ WITH <common_table_expression> [ ,…n ] ]
MERGE
[ TOP (expression) [ PERCENT ] ]
[ INTO ] <target_table> [ [ AS ] table_alias ] [ WITH( <merge_hint> ) ]
USING <table_source>
ON <search_condition>
<merge_clause> [ …n ]
[ OUTPUT <dml_select_list> ]
[ OPTION ( <query_hint> [ ,…n ] ) ]
;
<merge_clause>:=
{
WHEN MATCHED [ AND <search_condition> ]
THEN { UPDATE SET <set_clause> | DELETE }
| WHEN [ TARGET ] NOT MATCHED [ AND <search_condition> ]
THEN INSERT [ (column_list) ]
{ VALUES (values_list) | DEFAULT VALUES }
| WHEN SOURCE NOT MATCHED [ AND <search_condition> ]
THEN { UPDATE SET <set_clause> | DELETE }
}
Contoh penggunaan MERGE untuk sinkronisasi data
CREATE TABLE Original (o_pk INT PRIMARY KEY, o_name VARCHAR(10), o_number INT);
CREATE TABLE Replica (r_pk INT PRIMARY KEY, r_name VARCHAR(10), r_number INT);
CREATE PROCEDURE usp_SyncReplica AS
MERGE Replica
USING Original
ON o_pk = r_pk
WHEN MATCHED
AND (o_name != r_name OR o_number != r_number) THEN
-- Row exists but data differs
UPDATE SET r_name = o_name, r_number = o_number
WHEN SOURCE NOT MATCHED THEN
-- Row exists in Replica but not Original
DELETE
WHEN NOT MATCHED THEN
-- Row exists in Original but not Replica INSERT VALUES (o_pk, o_name, o_number)
OUTPUT $action, inserted.r_pk, deleted.r_pk;
Selamat Mencoba.
(KN-MvpSQL)