SQL Server Indonesia User Groups Community November 2008 - Posts - drowned in code

SQL Server Indonesia User Groups Community

SQL Server Indonesia User Groups Community
Welcome to SQL Server Indonesia User Groups Community Sign in | Join | Help
in Search

drowned in code

eat, sleep, breath, SQL

November 2008 - Posts

  • Berkenalan dengan Merge

    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.

     

    Posted Nov 25 2008, 12:08 AM by si_hendrik with no comments
    Filed under:
  • Akhirnya Lulus Juga

    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

  • Menggunakan Table-Valued Parameter di Data Flow SSIS

    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.

  • Menggunakan Table-Valued Parameter di Control Flow SSIS

    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

  • Berkenalan dengan Table-Valued Parameter

    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

    image

    Untuk definisi lebih detail, silakan baca di BOL atau MSDN.

  • We Are The Night

    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.

  • With or Without Merge Join in 2008

    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

    image

    Tambahkan satu OLE DB connection pada Package.dtsx, dengan cara membuka menu SSIS > New Connection..., pilih OLEDB lalu klik Add...

    image

    Klik New...

    image

    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

    image

    Tambahkan Data Flow Task ke dalam Control Flow

    image

    Double click Data Flow Task, tambahkan OLE DB Source

    image

    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

    image

    Tambahkan component Lookup ke dalam Data Flow Task, lalu hubungkan output OLE DB Source dengan component tersebut

    image

    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

    image

    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

    image

    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

    image

    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

    image

    Check ProductID pada Available Lookup Columns, lalu klik OK

    image

    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...

    image_thumb43

    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)

    image

    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

    image

    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

    image

    Tambahkan component Union All, lalu hubungkan output component Lookup dan component Derived Column dengan component Union All

    image

    Klik menu SSIS > Variables. Pada Variables pane, tambahkan satu variable dengan nama Result dengan tipe data Object

    image

    Tambahkan component Recordset Destination kedalam Data Flow Task, lalu hubungkan output component Union All dengan component tersebut

    image

    Double click Recordset Destination. Pada tab Component Properties, pilih User::Result sebagai property VariableName

    image

    Pada tab Input Columns, check ProductID dan Quantity, lalu click OK

    image

    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

    image

    Posted Nov 07 2008, 02:55 AM by si_hendrik with no comments
    Filed under:
  • With or Without Merge Join in 2005

    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

    image

    Tambahkan satu OLE DB connection pada Package.dtsx, dengan cara membuka menu SSIS > New Connection..., pilih OLEDB lalu klik Add...

    image

    Klik New...

     image

    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

    image

    Tambahkan Data Flow Task ke dalam Control Flow

    image

    Double click Data Flow Task, tambahkan OLE DB Source

    image

    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

    image

    Tambahkan component Lookup ke dalam Data Flow Task, lalu hubungkan output OLE DB Source dengan component tersebut

    image

    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

    image

    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

    image

    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...

    image

    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)

    image

    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

    image

    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

    image

    Tambahkan component Union All, lalu hubungkan output component Lookup dan component Derived Column dengan component Union All

    image

    Click menu SSIS > Variables. Pada Variables pane, tambahkan satu variable dengan nama Result dengan tipe data Object

    image

    Tambahkan component Recordset Destination kedalam Data Flow Task, lalu hubungkan output component Union All dengan component tersebut

    image 

    Double click Recordset Destination. Pada tab Component Properties, pilih User::Result sebagai property VariableName

    image

    Pada tab Input Columns, check Quantity dan ProductID, lalu click OK

    image

    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

    image

    Posted Nov 06 2008, 08:06 AM by si_hendrik with no comments
    Filed under:
More Posts
Powered by Community Server (Commercial Edition), by Telligent Systems