|
eat, sleep, breath, SQL
November 2008 - Posts
-
Merge adalah sebuah T-SQL Statement baru yang terdapat pada SQL Server 2008 yang digunakan untuk melakukan proses sinkronisasi antara dua buah table. Idenya seperti ini: satu table digunakan sebagai source dan table lainnya sebagai target. Dengan Merge, kita dapat melakukan sinkronisasi sehingga data yang terdapat pada target akan sama dengan yang terdapat pada source.
Contoh syntax sederhana Merge seperti ini:
MERGE
<table_target>
USING <table_source>
ON <merge_search_condition>
[ WHEN MATCHED [ AND <clause_search_condition> ]
THEN <merge_matched> ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ]
; |
Keterangan:
<table_target> | table yang dijadikan target sinkronisasi | <table_source> | table yang dijadikan source sinkronisasi | <merge_search_condition> | kondisi join antara <table_target> dan <table_source> | WHEN MATCHED | kondisi pada saat row di <table_target> sama dengan <table_source> berdasarkan kondisi <merge_search_condition> | WHEN NOT MATCHED [BY TARGET] | kondisi pada saat row di <source_table> tidak terdapat di <target_table> | WHEN NOT MATCHED BY SOURCE | kondisi pada saat row di <target_table> tidak terdapat di <source_table> |
Pada contoh berikut, saya akan membuat dua buah table yang diberi nama @oldtable dan @newtable dan berisi code dan quantity lalu melakukan merge sehingga data pada @oldtable menjadi sinkron dengan yang terdapat di @new table.
--deklarasi
declare @oldtable as
table (code varchar(10), quantity int)
declare @newtable as
table (code varchar(10), quantity int)
--insert data
insert @oldtable values ('prod1',100),
('prod2',200)
insert @newtable values ('prod1',500),
('prod3',300)
--merge data
merge @oldtable a
using @newtable b
on a.code = b.code
when
not
matched
then
insert (code, quantity)
values (b.code, b.quantity)
when
matched
and a.quantity <> b.quantity then
update
set a.quantity = b.quantity
when
not
matched
by
source
then
delete
output
$action, inserted.code, inserted.quantity, deleted.code, deleted.quantity
; |
Apabila kita execute, akan terlihat row mana saja yang di-insert, update, dan delete.
|
-
Salah satu resolution saya di tahun ini adalah mengikuti certification yang terakhir kali saya ambil di awal tahun 2007 lalu. Karena saya pindah divisi, jadinya saya ingin mengambil certification yang sesuai dengan track divisi saya. Setelah bilang bos, didaftarin, chit-chat dengan orang di tempat exam akhirnya dapet jadual pada tanggal 17 november kemarin.
Certification yang saya ambil adalah Exam 70-431, soal yang diberikan adalah 35 pilihan berganda dan 12 soal simulasi. Aduh... susah juga yah ternyata, tapi akhirnya selesai juga dalam waktu yang relatif lama, hampir 2 jam. hehe. Dan yang paling penting, lulus bo!
Setelah lulus
Beberapa hari setelah lulus, saya dikirimi e-mail dari site MCP. Untuk yang baru pertama kali mengikuti certification, biasanya akan diberikan semacam password sementara untuk masuk ke site tersebut dan melakukan registrasi menggunakan Windows Live ID plus membuat profile yang isinya adalah biodata dan alamat. Setelah itu kita dapat me-request Welcome Kit dan Transcript yang nantinya akan dikirimkan via pos ke alamat pengiriman yang tertera pada profile.
Sejujurnya saya baru tau beberapa bulan yang lalu soal Welcome Kit dan Transcript ini dari temen saya. Dia menunjukkan pada saya bahwa dia diberi kartu MCP dan transcript certification yang diikutinya. Huhuhu, sedihnya saya demi mengetahui hal tersebut. Dan sedihnya lagi, dalam beberapa hari terakhir ini saya mencoba me-request dan selalu fail. Jadi, buat yang lulus certification dari Microsoft, jangan lupa, buru-buru me-request Welcome Kit dan Transcript tadi yah. Sebaga tambahan, untuk setiap certification yang kita ambil, kita dapat me-request Transcript-nya.
Berhubung saya sudah pernah mengikuti certification sebelumnya, yaitu Exam 70-536, ditambah dengan exam kemarin saya mendapati bahwa profile saya bertambah menjadi dua yaitu Microsoft Certified Professional (MCP) dan Microsoft Certified Technology Specialist (MCTS). Untuk yang ingin lihat transcript saya, silakan kesini. Transcript ID saya 821363, dan access code nya SQLServer2008
|
-
download sample code
Beberapa bulan yang lalu saya pernah menanyakan di forum SQLServer-Indo mengenai bagaimana menggunakan Table-Valued Parameter di SSIS. Setelah nggak ada yang jawab (huhuhu...) akhirnya saya menemukan caranya sendiri. Kenapa saya ingin menggunakannya adalah karena saya ingin meng-execute stored procedure dengan TVP, dimana TVP nya adalah hasil transformasi di SSIS, lalu menyimpan nilai yang error ke file
Pada contoh yang saya buat, pertama-tama saya membuat 2 connection ke SQL Server. Yang pertama adalah OLEDB connection sedangkan yang kedua adalah ADO.NET connection
Lalu saya tambahkan satu variable dengan nama tvp dengan type data object
Kemudian saya buat DFT yang isinya transformasi data dengan destination Recordset Destination. Variable yang digunakan untuk menyimpan data di Recordset Destination adalah tvp.
Lalu saya buat DFT kedua, menghubungkan antara DFT pertama dan kedua. Saya gunakan Script Component sebagai source, menambahkan tvp pada property ReadOnlyVariables, menambahkan connection ke ADO.NET connection, menambahkan 3 input column yaitu name, quantity, dan error message (column yang ditambahkan sesuai dengan column yang terdapat pada input column recordset destination).
Pada script yang terdapat di ScriptComponent saya tambahkan script berikut:
C# |
private
SqlDataReader _reader;
private
SqlConnection _connection;
public
override
void PreExecute()
{
base.PreExecute();
System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter();
DataTable dtTVP = new
DataTable();
adapter.Fill(dtTVP, this.Variables.tvp);
_connection = new
SqlConnection(this.Connections.ADONETConnection.ConnectionString);
_connection.Open();
SqlCommand command = new
SqlCommand("InsertProduct", _connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@product", dtTVP);
_reader = command.ExecuteReader();
}
public
override
void PostExecute()
{
base.PostExecute();
_connection.Close();
}
public
override
void CreateNewOutputRows()
{
while (_reader.Read())
{
Output0Buffer.AddRow();
Output0Buffer.name = _reader.GetString(0);
Output0Buffer.quantity = _reader.GetInt32(1);
Output0Buffer.errormessage = _reader.GetString(2);
}
Output0Buffer.SetEndOfRowset();
}
} |
VB |
Private _reader As SqlDataReader
Private _connection As SqlConnection
Public
Overrides
Sub PreExecute()
MyBase.PreExecute()
Dim adapter As
New OleDb.OleDbDataAdapter
Dim dtTVP As
New DataTable
adapter.Fill(dtTVP, Me.Variables.tvp)
_connection = New SqlConnection(Me.Connections.ADONETConnection.ConnectionString)
_connection.Open()
Dim command As
New SqlCommand("InsertProduct", _connection)
command.CommandType = CommandType.StoredProcedure
command.Parameters.AddWithValue("@product", dtTVP)
_reader = command.ExecuteReader()
End
Sub
Public
Overrides
Sub PostExecute()
MyBase.PostExecute()
_connection.Close()
End
Sub
Public
Overrides
Sub CreateNewOutputRows()
While _reader.Read()
Output0Buffer.AddRow()
Output0Buffer.name = _reader.GetString(0)
Output0Buffer.quantity = _reader.GetInt32(1)
Output0Buffer.errormessage = _reader.GetString(2)
End
While
Output0Buffer.SetEndOfRowset()
End
Sub |
Kemudian saya tambahkan Flat File Destination ke Data Flow dan menghubungkannya dengan Script Component.
|
-
download sample code
Setelah berkenalan dengan Table-Valued Parameter (TVP) tentu saja saya ingin cepat menggunakannya dalam berbagai aspek kehidupan, terutama SSIS yang menjadi sumber mata pencaharian saya.
Ternyata untuk menggunakannya di control flow, kita tidak (atau saya belum menemukan caranya yah?) dapat menggunakan component Execute SQL Task karena pada saat malakukan mapping parameter, tidak ada pilihan untuk datatype object. Cara untuk mengkonsumsinya adalah dengan menggunakan Script Task.
Pada contoh yang dapat di bawah saya akan menunjukkan bagaimana mengeksekusi sp yang telah dibuat pada tulisan sebelumnya dari SSIS.
Yang pertama kali harus dibuat adalah connection ke .net provider untuk sql client.
Kemudian pada control flow tambahkan script task dan isi void Main (untuk c#) atau sub Main (untuk vb) dengan script berikut:
C# |
public
void Main()
{
//buat datatable yang column-nya sama dengan struktur tvp
DataTable dt = new
DataTable();
dt.Columns.Add("name",System.Type.GetType("System.String"));
dt.Columns.Add("quantity",System.Type.GetType("System.Int32"));
dt.Columns.Add("errormessage",System.Type.GetType("System.String"));
//isi table dengan nilai yang ingin kita passing ke procedure
dt.Rows.Add("prod1", 100, DBNull.Value);
dt.Rows.Add("prod2", 200, DBNull.Value);
dt.Rows.Add("prod3", 0, DBNull.Value);
//connect ke database
SqlConnection connection = new
SqlConnection(Dts.Connections["localhost.Research"].ConnectionString);
connection.Open();
//execute InsertProduct dengan parameter dt
SqlCommand command = new
SqlCommand("InsertProduct", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@product", dt);
command.ExecuteNonQuery();
//tutup koneksi
connection.Close();
Dts.TaskResult = (int)ScriptResults.Success;
} |
VB | Public
Sub Main()
'
' Add your code here
'
'buat datatable yang column-nya sama dengan struktur tvp
Dim dt As
New DataTable()
dt.Columns.Add("name", System.Type.GetType("System.String"))
dt.Columns.Add("quantity", System.Type.GetType("System.Int32"))
dt.Columns.Add("errormessage", System.Type.GetType("System.String"))
'isi table dengan nilai yang ingin kita passing ke procedure
dt.Rows.Add("prod1", 100, DBNull.Value)
dt.Rows.Add("prod2", 200, DBNull.Value)
dt.Rows.Add("prod3", 0, DBNull.Value)
'connect ke database
Dim connection As
New SqlConnection(Dts.Connections("localhost.Research").ConnectionString)
connection.Open()
'execute InsertProduct dengan parameter dt
Dim command As
New SqlCommand("InsertProduct", connection)
command.CommandType = CommandType.StoredProcedure
command.Parameters.AddWithValue("@product", dt)
command.ExecuteNonQuery()
'tutup koneksi
connection.Close()
Dts.TaskResult = ScriptResults.Success
End
Sub
|
|
-
Beberapa bulan terakhir ini banyak artikel dan forum yang membahas mengenai Table-Valued Parameter (TVP). Saking hebohnya, ada yang menyebut TVP sebagai feature penting yang akan membuat banyak orang tertarik untuk menggunakan SQL Server 2008.
TVP adalah type parameter baru di SQL 2008 yang di-deklarasikan dengan menggunakan type data table yang kita definisikan. Kita dapat menggunakannya di dalam stored procedure atau function, tanpa sebelumnya harus membuat temporary table atau passing banyak parameter. Kita dapat menggunakannya pada saat melakukan Transact-SQL atau langsung dari aplikasi.
Ada kalanya dimana saya harus berulang kali meng-execute sebuah sp yang isinya satu baris data dari aplikasi karena validasi terhadap data disimpan di sp. Hal ini tentu menimbulkan round trip antara server dan client apabila misalnya pada saat si user melakukan proses penyimpanan data terdapat lebih dari 1 data yang harus divalidasi. Dengan TVP, saya hanya cukup satu kali mengeksekusi sp, dan mem-passing kesemua data di dalam TVP.
Pada contoh di bawah ini, saya akan membuat sebuah stored procedure untuk memvalidasi data, meng-insert data yang valid, dan mengembalikan data yang tidak valid. Tolong jangan liat sp-nya yang berantakan (hehe), tapi perhatikan bagian TVP-nya.
Pertama kita buat dulu table type-nya
|
create
type ProductType as
table (name varchar(20), quantity int, errormessage varchar(100))
|
Lalu kita buat stored procedure untuk meng-insert data, perhatikan bahwa tvp harus digunakan hanya sebagai input dan readonly sehingga kita tidak dapat melakukan transaksi insert, update atau delete terhadap parameter tersebut di dalam sp.
|
create
procedure InsertProduct
@product as ProductType readonly
as
declare @goodProduct as ProductType
declare @badProduct as ProductType
insert
into @goodProduct
(name, quantity)
select name, quantity from @product where quantity between 1 and 150
insert
into @badProduct
(name, quantity,errormessage)
select name, quantity,
'quantity should be between 1 and 150'
as errormessage from @product where quantity not
between 1 and 150
select
*
from @badproduct
|
Lalu kita test sp nya dengan statement di bawah ini
|
declare @product as ProductType
insert
into @product
(name, quantity)
values ('prod1',100),('prod2',200),('prod3',0)
exec InsertProduct
@product
|
Pada saat di-execute, sp nya akan mengembalikan data yang tidak valid
Untuk definisi lebih detail, silakan baca di BOL atau MSDN.
|
-
Kalau lihat event calendar untuk satu tahun ke depan, kita akan sadar kalau semua monthly meeting SQL Server diadakan pada malam hari. Ternyata, untuk dateng ke acara malam itu lebih berat dibandingkan acara siang hari. Apalagi kalau seharian udah sibuk meeting, heavy research, tuning sp yang lambat banget, atau dimarahin boss (yang terakhir ini sering kejadian sama saya, huhuhu). Supaya badan kita tetep fit selama acara berlangsung, ada baiknya puter mp3 yang sedikit agak membangkitkan suasana kayak We are the night nya ... (ups... boleh disebutin gak yah?) Mudah2an di event calendar untuk tahun depan monthly meeting nya bisa diadain di siang hari juga yah. hehe.
|
-
Download sample code Apabila pada tulisan sebelumnya saya menunjukkan bagaimana melakukan left join dengan menggunakan SSIS 2005, makan pada tulisan yang sekarang saya akan menggunakan SSIS 2008. Sebagai informasi, di 2008 component Lookup telah di-enhance dengan UI yang baru dan tambahan output yaitu No Match Output sebagai output row yang tidak memiliki lookup. Buka Business Intelligence Studio (BIDS), lalu buat SSIS project baru dengan nama WithOrWithoutMergeJoin2008 dengan cara meng-klik menu File > New Project..., pilih Business Intelligence Projects dari Project Types, pilih Integration Services Project dari Templates, beri nama WithOrWithoutMergeJoin2008 pada Name lalu klik OK Tambahkan satu OLE DB connection pada Package.dtsx, dengan cara membuka menu SSIS > New Connection..., pilih OLEDB lalu klik Add... Klik New... Pilih Native OLE DB\SQL Server Native Client 10.0 dari Provider, ketik localhost atau . (titik) di server name, pilih metode autentikasi yang digunakan (dalam contoh ini saya memilih Use Windows Authentication) lalu klik OK. Klik OK sekali lagi untuk menutup dialog Configure OLE DB Connection Manager Tambahkan Data Flow Task ke dalam Control Flow Double click Data Flow Task, tambahkan OLE DB Source Double click OLE DB Source, pilih LocalHost pada OLE DB connection manager, pilih SQL Command pada Data access mode, lalu isi SQL Command text dengan query berikut lalu klik OK | select 'Prod1' as ProductCode, 10 as Quantity union all select 'Prod3' as ProductCode, 5 as Quantity | Tambahkan component Lookup ke dalam Data Flow Task, lalu hubungkan output OLE DB Source dengan component tersebut Double click Lookup (perhatikan UI nya yang berbeda dengan di 2005), pada tab General pilih Redirect rows to no match output pada Specify how to handle rows with no matching entries Pada tab Connection pilih LocalHost pada OLE DB connection Manager, pilih Use results of an SQL query lalu isi query dengan SQL Statement berikut | select 1 as ProductID, 'Prod1' as ProductCode union all select 2 as ProductID, 'Prod2' as ProductCode | Pada tab Columns, klik kanan pada area yang saya beri tandai dengan warna merah lalu pilih Edit Mappings. Berbeda dengan 2005 yang otomatis me-mapping Column dengan nama yang sama, di 2008 kita harus melakukannya secara manual Pilih ProductCode pada Input Column, pilih ProductCode pada ProductCode lalu klik OK. Yang harus kita perhatikan adalah bahwa tipe data pada kedua column harus sama. Pada saat kita memilih Input Column, Lookup Column akan menampilkan column-column dengan tipe data yang sama dengan Input Column Check ProductID pada Available Lookup Columns, lalu klik OK Karena kita ingin mengisi data penjualan yang tidak memiliki ProductID dengan null, pertama-tama kita harus mengetahui dulu tipe data ProductID. Untuk melihatnya, klik kanan pada component Lookup, lalu pilih Show Advanved Editor... Pada tab Input and Output Properties, expand Lookup Output, expand Output Columns, pilih Product ID, lalu lihat tipe data nya pada properties. Dari gambar di bawah kita dapat mengetahui bahwa tipe datanya adalah four-byte signed integer (DT_14) Tambahkan component Derived Column pada Data Flow Task, lalu hubungkan output Lookup dengan component tersebut. Pada saat muncul dialog Input Output Selection, pilih Lookup No Match Output pada Output lalu klik OK Double click Derived Column, tambahkan column dengan nama ProductID, NULL(DT_14) sebagai expression, lalu klik OK. NULL(DT_14) adalah sebuah expression untuk mengisi nilai null pada column dengan tipe data four-byte signed integer, tipe data yang sama dengan column ProductID yang terdapat pada component Lookup Tambahkan component Union All, lalu hubungkan output component Lookup dan component Derived Column dengan component Union All Klik menu SSIS > Variables. Pada Variables pane, tambahkan satu variable dengan nama Result dengan tipe data Object Tambahkan component Recordset Destination kedalam Data Flow Task, lalu hubungkan output component Union All dengan component tersebut Double click Recordset Destination. Pada tab Component Properties, pilih User::Result sebagai property VariableName Pada tab Input Columns, check ProductID dan Quantity, lalu click OK Selesai! Pada saat package di-execute, akan terlihat bahwa dari dua data penjualan yang diambil, satu data memiliki lookup (Prod1) dan satu data lainnya tidak memiliki lookup (Prod3), keduanya di-union dan menghasilkan 2 data pada saat disimpan, seperti sebuah transformasi left join dengan menggunakan Merge Join 
|
-
download sample code Setelah beberapa minggu terakhir dilanda kesibukan, akhirnya saya bisa nulis lagi. Berhubung udah lama, jari2 tangan rasanya jadi kaku, lidah terasa kelu (halah, apa lagi!), jadi bingung mau nulis apa (hehe). Anyway, begini ceritanya: waktu bulan puasa yang lalu saya diundang untuk melakukan POC (prove of concept, bener gak yah nulisnya?) untuk menulis ulang sebuah fact yang tadinya dibuat menggunakan stored procedure di SQL Server 2000 menjadi SSIS. Pada saat POC tersebut, saya sering mengalami kesulitan pada saat harus melakukan left join (hihi... newbie banget yah) dengan menggunakan component Merge Join nya SSIS. Untuk yang belum tahu, Merge Join ini digunakan untuk melakukan join, baik itu inner, left atau right join antara dua input. Sulit, karena saya harus melakukan sorting terlebih dahulu terhadap dua input, men-set property IsSorted nya menjadi true, dan men-set property SortOrder pada column. Padahal transformasi yang ingin saya buat cukup sederhana: melakukan left join antara fact dan dimension, lalu mengambil ID Dimension untuk disimpan di fact. Apabila ID-nya nggak ketemu, ID untuk fact diisi null. Pada source code yang saya sisipkan, Anda bisa melihat bagaimana saya melakukannya pada package MergeJoinPackage.dtsx Ternyata, di SSIS 2005 kita dapat melakukan left join menggunakan lookup, dengan sedikit trik tentunya. Sebagai contoh saya akan membuat sebuah fact yang isinya mengambil data penjualan, dan melakukan left join dengan dimension product dengan ProductCode sebagai relasinya. Apabila ProductCode tidak ditemukan, maka ProductID penjualan akan diisi dengan null. Hasil transformasinya akan disimpan ke dalam sebuah variable dengan nama Result. Berikut adalah langkah-langkahnya: Buka Business Intelligence Studio (BIDS), lalu buat SSIS project baru dengan nama WithOrWithoutMergeJoin2005 dengan cara meng-klik menu File > New Project..., pilih Business Intelligence Projects dari Project Types, pilih Integration Services Project dari Templates, beri nama WithOrWithoutMergeJoin2005 pada Name lalu klik OK  Tambahkan satu OLE DB connection pada Package.dtsx, dengan cara membuka menu SSIS > New Connection..., pilih OLEDB lalu klik Add... Klik New...  Pilih Native OLE DB\SQL Native Client dari Provider, ketik localhost atau . (titik) di server name, pilih metode autentikasi yang digunakan (dalam contoh ini saya memilih Use Windows Authentication) lalu klik OK. Klik OK sekali lagi untuk menutup dialog Configure OLE DB Connection Manager Tambahkan Data Flow Task ke dalam Control Flow Double click Data Flow Task, tambahkan OLE DB Source Double click OLE DB Source, pilih LocalHost1 pada OLE DB connection manager, pilih SQL Command pada Data access mode, lalu isi SQL Command text dengan query berikut lalu klik OK | select 'Prod1' as ProductCode, 10 as Quantity union all select 'Prod3' as ProductCode, 5 as Quantity | Tambahkan component Lookup ke dalam Data Flow Task, lalu hubungkan output OLE DB Source dengan component tersebut Double click Lookup, pada tab Reference Table pilih LocalHost1 pada OLE DB connection Manager, pilih Use results of an SQL query lalu isi query dengan SQL Statement berikut | select 1 as ProductID, 'Prod1' as ProductCode union all select 2 as ProductID, 'Prod2' as ProductCode | Pilih tab Columns, lalu check ProductID. Karena input memiliki column yang sama dengan lookup yaitu Product Code, maka SSIS secara otomatis akan me-mapping kedua column tersebut. Apabila kedua column yang akan digunakan sebagai kondisi join belum di-mapping, atau Anda ingin menambahkan column lain, klik kanan pada area yang saya beri tanda merah lalu pilih menu Edit Mappings Karena kita ingin mengisi data penjualan yang tidak memiliki ProductID dengan null, pertama-tama kita harus mengetahui dulu tipe data ProductID. Untuk melihatnya, klik kanan pada component Lookup, lalu pilih Show Advanved Editor... Pada tab Input and Output Properties, expand Lookup Output, expand Output Columns, pilih Product ID, lalu lihat tipe data nya pada properties. Dari gambar di bawah kita dapat mengetahui bahwa tipe datanya adalah four-byte signed integer (DT_14) Disinilah trick-nya dimulai. Tambahkan component Derived Column pada Data Flow Task, lalu hubungkan error output Lookup (Error ouput adalah output dengan anak panah berwarna merah) dengan component tersebut. Pada saat muncul dialog Configure Error Output, pilih Redirect row pada column Error lalu klik OK Double click Derived Column, tambahkan column dengan nama ProductID, NULL(DT_14) sebagai expression, lalu klik OK. NULL(DT_14) adalah sebuah expression untuk mengisi nilai null pada column dengan tipe data four-byte signed integer, tipe data yang sama dengan column ProductID yang terdapat pada component Lookup Tambahkan component Union All, lalu hubungkan output component Lookup dan component Derived Column dengan component Union All Click menu SSIS > Variables. Pada Variables pane, tambahkan satu variable dengan nama Result dengan tipe data Object  Tambahkan component Recordset Destination kedalam Data Flow Task, lalu hubungkan output component Union All dengan component tersebut Double click Recordset Destination. Pada tab Component Properties, pilih User::Result sebagai property VariableName Pada tab Input Columns, check Quantity dan ProductID, lalu click OK Selesai! Pada saat package di-execute, akan terlihat bahwa dari dua data penjualan yang diambil, satu data memiliki lookup (Prod1) dan satu data lainnya tidak memiliki lookup (Prod3), keduanya di-union dan menghasilkan 2 data pada saat disimpan, seperti sebuah transformasi left join dengan menggunakan Merge Join 
|
More Posts
|
|
|