SSIS(SQL Server Integration Services)’teki Merge Join komponenti, elimizdeki veri setini genişletmek için kullanışlı bir araçtır. Veri setini genişletmek derken ne demek istediğimizi anlatayım önce. İlişkisel veri tabanı sistemlerindeki “Foreign Key” mantığını az çok hepimiz biliyoruzdur. Bir tabloda “Foreign Key” özelliğini taşıyan kolon, aslında simgesel bir değerdir. Ne demek simgesel? Yani başka bir tabloda o değere karşılık gelen bir veri bulunmaktadır ve o değer de aslında o veriyi temsil etmektedir. Normalizasyon kuralları gereği veriyi direkt ilgili tablo içinde bulundurmak yerine, “Foreign Key” ilişkisi kurulur. Sözü edilen “Foreign Key” kolonundaki herhangi bir verinin neye karşılık geldiğini, neyi ifade ettiğini bulmak için ise o kolonun ilgili tablosuna gidip, bahsettiğimiz değerin satırına bakmamız ve hangi değerleri temsil ettiğini görmemiz gerekir. İşte veri setini genişletmek derken söylemek istediğimiz ise bu “Foreign Key” ilişkisini kullanarak ilgili tablodan öğrenmek istediğimiz değeri veri setimize eklemek. Başka bir deyişle, SQL üzerindeki “join” mantığına benzer bir mantığı SSIS’te Merge Join komponentini kullanarak gerçekleştireceğiz.

SSIS üzerinde join işlemi gerçekleştirmek için elimizdeki tek alternatif Merge Join komponenti değil tabii ki. Lookup komponenti kullanarak veya SQL sorguları yazarak da bu işlemi gerçekleştirebiliriz. Fakat bu yazının konusu Merge Join komponenti olduğu için sadece onu ele alacağız, diğer alternatifler başka yazılara :))

Öncelikle bu yazıda kullanacağımız tabloları tanıyalım. Bu işlerle uğraşmış olan çoğu kişice tanınan, bilinen Northwind veritabanını kullanacağız. İçerisindeki tablolardan Order Details, Products, Categories ve Suppliers tabloları işimize yarayacak olan tablolar. Yapacağımız işi tam olarak anlamak için, tabloların yapılarını ve hangi kolonlar üzerinden “Foreign Key” ilişkileri kurulduğunu iyi anlamamız gerekiyor. Gerekli SQL sorgularını yazarak tablo yapılarına bir genel bakış atalım.

İlk tablo ana tablomuz, bir diğer deyişle genişletilecek olan veri setimiz. Buradaki “Foreign Key” alanını kullanarak diğer tablolardan bilgi alacağız. Bilgiden kastımız da tabii ki çeşitli kolonlar almak. Ana tablo olarak kullanacağımız tablo Order Details tablosu. Yapısına bakacak olursak:

OrderDetails

Yukarıda göründüğü gibi tabloda 5 kolon var. Bu tabloda OrderID ve ProductID kolonları aslında “Composite Key” konumunda. Yani iki adet “Foreign Key” bir araya gelerek bir “Primary Key” oluşturmuş. Burada sadece ProductID kolonunu FK(Foreign Key) olarak göstermemin sebebi ise benim Products tablosuna gidip oradan bir kolon alacak olmam ve beni oradaki veriye ulaştıracak olan FK kolonunun ProductID olması. Products tablosunu gördüğümüzde bunu daha iyi anlayacağız.

Products

Üstteki tablo Products tablosu. Kolonlarının içeriğinin anlaşılması önemli olduğundan, sadece ilk 10 kaydı görmemiz yeterli. ProductID kolonu “Primary Key” konumunda, hatırlayacağınız üzere Order Details tablosunda ise “Foreign Key” konumundaydı. Bizim amacımız Order Details tablosunu Products tablosuna ProductID kolonu üzerinden bağlayarak siparişlerde satılan ürünlerin isimlerini görmek. Order Details tablosundan bu bilgiye direkt ulaşabilmemiz mümkün değil çünkü sadece ürünün ID değerini görüyoruz. İşte veri setini genişletmekten kastımız bu. Tabloda iki tane daha FK olma özelliği taşıyan kolon var. Bunlardan da ilgili tablolarına yani SupplierID üzerinden Suppliers tablosuna, CategoryID üzerinden Categories tablosuna giderek oradan da siparişte satılan ürünün kategori ve tedarikçi bilgisine ulaşacağız. Elimizdeki final tabloda siparişlerde satılan ürünün id’si, adı, kategorisi ve tedarikçi bilgisi, diğer Order Details tablosu kolonlarıyla beraber yer alacak. Categories ve Suppliers tabloları da şu şekilde:

Categories

Suppliers

Üstte bahsettiğimiz işlem önceden de dediğimiz gibi aslında bir join işlemi. Şimdi bu işlemi SSIS üzerinde Merge Join komponentini kullanarak gerçekleştirelim. Bunun için Visual Studio üzerinde yeni bir “Integration Services Project” açalım ve içinde default olarak gelen pakete uygun bir isim verelim. Ben “MergeJoin” demeyi tercih ettim. Control Flow’a bir Data Flow Task ekleyelim ve ismine de “DFT_OrderDetails” diyelim. (DFT, Data Flow Taskın kısaltması) Biliyorsunuz ki SSIS üzerinde ETL(Extract-Transform-Load) işlemleri yapabilmemiz için Data Flow Task komponentine ihtiyacımız var:

DataFlowTask

Data Flow Taskın içerisine girdiğimizde Data Flow komponentlerinden hangilerini kullanmamız gerektiğini düşünelim. Merge Join işlemi için 2 tabloya ihtiyacımız var. Bir tanesi input tablosu(ana tablo) diğeri ise referans tablosu(kendisinden kolon alınacak olan tablo). İnput tablosu Order Details, referans tabloları ise sırasıyla Products, Categories ve Suppliers olacak. SQL üzerindeki join işlemlerine muhtemelen aşina olduğunuz için, Left, right, inner ve full join arasındaki farkları biliyorsunuzdur. Bunlar ile alakalı bilgiye ihtiyacınız varsa araştırmanızı tavsiye ederim. Bizim bu noktada bilmemiz gereken şey ise Merge Join komponentinin join türlerinin 3 tanesini gerçekleştirebildiği. Bunlar left, inner ve full join. Right neden yok diyecek olursanız, birazdan göreceğiz ki Merge Join komponenti bunun için de bize bir seçenek sunmakta. Merge Join komponenti işleme sokmak için sadece 2 tablo kabul eder, dışarıya ise bir tablo verir. Bazı komponentlerde bulunan “Error output” özelliğini ise desteklemez.

Öncelikle, ilk Merge Join işlemi için kullanacağımız tabloları getirecek olan komponentleri data flow’a yerleştirelim. İlk etapta bir input bir referans olmak üzere iki tablo getireceğimiz için ve bu tabloları da veritabanından alacağımız için, iki tane OLE DB Source komponentine ihtiyacımız var.

Oledb_sources1

İsimlendirmeleri de üstteki gibi verdikten sonra, komponentlerin içlerine girip istediğimiz ayarları yapacağız. Fakat öncesinde, Northwind veritabanına ulaşabilmemiz için bağlantıyı sağlayacak olan gerekli Connection Manager’i oluşturalım. Aşağıdaki adımlarla bunu yapıyoruz:

CM_Step1.JPG

Solution Explorer’da bulunan Connection Managers menüsüne sağ tıklayıp üstteki gibi New Connection Manager diyoruz. Karşımıza aşağıdaki pencere çıkıyor.

CM_Step2

Veritabanına bağlanacağımız için OLEDB’yi seçip Add diyoruz ve aşağıdaki pencereye geçiyoruz.

CM_Step3

Data connections bölümü eğer ilk defa oluşturuyorsanız sizde boş olacaktır, benim önceki Connection Manager’lerim de gözüküyor. New dedikten sonra alta geçiyoruz.

CM_Step4

Server name kısmına localhostu kullanacağımızı belirtmek üzere “.” yazıyoruz, database ise Northwind oluyor. OK dedikten sonra aşağıdaki gibi sağ tarafta Northwind için connection manager’ımız oluşuyor.

CM_Step5

Şimdi OLE DB Source komponentlerinin içini düzenleyip, tabloları getirmemiz gerek. Fakat bu düzenleme işlemine geçmeden önce, Merge Join komponenti hakkında bilinmesi gereken bir durum var.  Merge Join komponenti sadece “anahtar kolona göre sıralanmış olan” tabloları kabul eder ve işleme sokar. Buradaki anahtar kolon ifadesi nedir? Örneğin ilk Merge Join işleminde birbirine joinlenecek olan Order Details ve Products tablolarının bu işlemi gerçekleştirebilmesini sağlayan kolon ProductID idi. Yani bu da anahtar kolon ProductID demek oluyor. O zaman işleme girecek olan her iki tablonun da ProductID kolonuna göre sıralanmış olması gerekiyor ki, herhangi bir sorun çıkmasın ve işlem başarıyla tamamlansın. Bu durumda, biz bu tabloları anahtar alana göre nasıl sıralayacağız? Bunun için iki yöntemden birini kullanabiliriz. Tabloları getirecek olan OLE DB Source komponentleri içerisinde SQL sorgusu kullanarak, tabloları ORDER BY ifadesi ile ProductID kolonuna göre sıralayabiliriz, ya da SSIS’in bize sunduğu bir diğer komponent olan Sort’u kullanabiliriz. Fakat, burada düşünülmesi gereken bir husus var. Sort komponenti, “Blocking” olma özelliğini taşıyan bir komponenttir. Yani, data flow’dan akan tüm satırlar Sort komponentine girip, sort(sıralama) işlemi tamamen tamamlanmadan hiçbir satırın data flow içerisinde aşağıdaki komponentlere doğru akmasına izin vermez. Bu da performans açısından paketi zora sokabilir. Bunun önüne geçmek için, ilk yöntemi kullanmak daha doğru. Fakat ileride de göreceğimiz gibi, öyle bir nokta gelecek ki Sort komponentini kullanmamız gerekecek. Bu bilgiden sonra peki Merge Join komponentinin blocking özelliği nedir diye sorabilirsiniz. Merge Join komponenti “Partial Blocking” bir komponenttir. Bu da demek oluyor ki belirli bir miktarda satır gelip Merge Join komponenti içerisinde işleme girip işlemini tamamlamadan, satırların aşağıya akmasına izin vermez. O satır eşiği aşıldıktan sonra, satırların akması devam eder. Bunların dışında bir de “Non Blocking” komponentler vardır ki bunlar her bir satırın işleme girip işlemden çıktıktan sonra anında aşağıya akmasına izin verir,  data flowu bekletmez.

Konumuza geri dönecek olursak, üstteki bilgileri kullanarak tabloları getirecek olan source komponentlerinin içini şu şekilde düzenleyeceğiz:

SRC_Step1

Az önce oluşturduğumuz connection manager’imizi kullanarak bahsettiğimiz gibi ProductID kolonuna göre ascending biçimde sıraladık. Products tablosu için:

SRC_Step2

Aynı şekilde Products’ı da düzenledik. Dikkat edelim ki sadece ihtiyacımız olan kolonları SELECT ve FROM ifadesi arasına yazarak data flow’un yükünü azalttık. Fakat, işimiz bu kadarla bitmedi. Bu veriyi ORDER BY ifadesi ile sıralayarak getirmemize rağmen, SSIS henüz bu verinin sıralı olduğunun farkında değil. Bu şekilde bu komponentleri Merge Join’e bağlamaya çalışalım:

IsSorted_Step1

Merge Join komponenti “IsSorted” özelliğinin “TRUE” olmadığına dair bir hata veriyor. Bu şunu ifade ediyor: biz her ne kadar veriyi sıralasak da, SSIS’e bu verinin sıralı olduğunu bildirmemiz gerekiyor. Bunu da IsSorted özelliği vasıtasıyla yapıyoruz. Peki bu özelliğe nereden ulaşıyoruz?

IsSorted_Step2

Üstteki gibi komponentlerden birine sağ tıklayıp “Show Advanced Editor” dedik. Karşımıza aşağıdaki ekran geldi.

IsSorted_Step3

Bu ekranda en sağdaki “Input and Output Properties” sekmesine geldik ve sol taraftaki listeden “OLE DB Source Output” bölümüne tıklayarak sağda açılan özellikler penceresinden “IsSorted” özelliğini “True” yaptık. İşlem bununla da bitmedi. Verinin sıralı olduğunu SSIS’e söyledik fakat hangi kolona göre sıraladığımızı henüz söylemedik. Bunun için de aşağıdaki adımı uyguluyoruz.

IsSorted_Step4

ProductID kolonunun “SortKeyPosition” özelliğini 1’e çevirdik. Bu da demek oluyor ki biz bu veri setini ProductID kolonuna göre sıraladık.

Artık iki tablo da sıralı olduğuna göre, bu tabloları Merge Join komponentine bağlayabiliriz.

MRGJ_step1

Bu aşamadan sonra sıra Merge Join komponentinin içini düzenlemekte.

MRGJ_Step2

Merge Join’e çift tıkladığımızda karşımıza gelen ekran yukarıdaki gibi. Görebileceğimiz üzere anahtar kolonlar biz hiç işlem yapmamamıza rağmen otomatik olarak birbirlerine bağlanmış durumda. Bizim yapacağımız ise hangi kolonları sonuç tablosunda görmek istediğimiz. İlk adım olarak, ben Order Details tablosundaki tüm kolonlara ek olarak, Products tablosundan ProductName, CategoryID ve SupplierID kolonlarını görmek istiyorum. Son iki kolonu görmek istememin sebebi daha sonra bu kolonlar üzerinde Categories ve Suppliers tablolarına gidecek olmam. İstediğim kolonları tikleyerek komponenti hazır hale getirdim. Aşağı kısımda kolonların Merge Join’e girerken ve çıkarken isimlerinin ne olacağı yazıyor. Bunları istediğimiz gibi ayarlayabiliyoruz.

Şimdi daha önce bahsettiğimiz bir noktaya geri dönelim. Merge Join komponenti 3 tür join gerçekleştirebiliyor demiştik. Bunlar left, inner ve full join. Right join için ise önümüze şu seçenek sunulmakta; left join seçeneğini seçersek sağ taraftaki “Swap Inputs” butonu aktif oluyor. Bu da sol taraftaki tabloyu sağa, sağ taraftaki tabloyu sola alarak aslında right join gerçekleştirmemizi sağlıyor. Aşağıda bu durumu gösterelim:

MRGJ_Step3jpg

Merge Join komponenti, join işlemlerini yaparken T-SQL’deki join işlemi gibi yapar. Yani, bir değere karşılık gelen birden fazla değer varsa, eşleşmeyi birden çok kez gerçekleştirecek ve tamamını getirecektir. Seçilen join tipine göre, eşleşmeyen satırlara ne olacağı da değişmektedir. Inner join kullanılmışsa, eşleşmeyen satırlar data flow’dan çıkacak ve tamamen göz ardı edilecektir. Eğer left join kullanılmışsa, sol taraftaki tablonun eşleşmeyen satırları, karşılık gelen referans değerlerine NULL basılmış haliyle gelecek, sağ taraftaki tablonun eşleşmeyen satırları ise tamamen göz ardı edilecektir. Full join’de ise, iki taraftan da eşleşmeyen değerler data flow’a gelecektir. Merge Join’in bir diğer özelliği ise, eşleşecek olan anahtar alanların veri tipi aynı olmalıdır. Eğer “string” tipi anahtar alanlar söz konusuysa, ikinci input(referans) tablosundaki anahtar alanın uzunluğu, birinci input tablosundaki anahtar alanın uzunluğuna eşit ya da ondan küçük olmalıdır. Merge Join’e dair bahsetmemiz gereken bir özellik de “TreatNullsAsEqual” özelliğidir.

MRGJ_Step4jpg

Bu özellik “False” ise, NULL’lar eşit olarak algılanmazlar. Bu sistemin aynısı SQL Server’da da mevcuttur. NULL ifadesi, orada bulunması gereken verinin olmadığına, dolayısıyla bilinmeyen bir değer olduğuna dair bir işarettir. SQL Server NULL’ları eşit görmez, çünkü bilinmeyen iki değerin birbirine eşit olup olmadığı da bilinemez. Fakat Merge Join komponenti, NULL’lara eşit olarak davranma fırsatını bize vermektedir. Bu özelliği “True” yaparsak, NULL’lar eşit olarak varsayılacağından, komponent bunları birbirine eşleyecek ve NULL’lar üzerinden de join işlemini gerçekleştirecektir. Ben şimdilik bu özelliği “True” olarak bırakıyorum.

İlk join işlemimizi gerçekleştirdik ve ProductName kolonuna eriştik. Siparişlerde satılan ürünlerin artık sadece id’sini değil, aynı zamanda ismini de görebiliyoruz. Sıradaki adımda ben bu ürünlerin hangi kategoriye ait olduklarını da görmek istiyorum. Bunun için bir Merge Join komponentine ve bir OLE DB Source komponentine daha ihtiyacım var. Önce tabloyu getirecek olan source komponentini ekleyelim.

MRGJ_Step6

Komponentin içini de yine diğerleri gibi anahtar alana göre sıralayarak ve Advanced Editor kısmından IsSorted ve SortKeyPosition özelliklerini doğru bir biçimde değiştirerek hazırlamalıyız.

MRGJ_Step5

Bu kez anahtar alan CategoryID olduğu için, o alana göre sıralama yaptık. Advanced editor’e bakacak olursak:

MRGJ_Step7

IsSorted değeri “True” ve,

MRGJ_Step8

CategoryID kolonunun “SortKeyPosition” değeri ise 1.

Bu tablo ikinci Merge Join komponentine sağ taraftan girecek olan tablo, diğer bir deyişle referans tablosu. Soldan girecek olan tablo ise, ilk Merge Join sonucunda oluşan tablo. Fakat her Merge Join’de olduğu gibi, ikincisinde de iki taraf da sıralanmalı. Bu sıralamanın anahtar kolona göre olacağını yukarıda söylemiştik. Burada anahtar kolon CategoryID. Şunu belirtelim, “default” olarak, Merge Join komponenti sonucunda oluşan tablo, her zaman anahtar kolona göre sıralı olarak oluşur. Bu komponentin özelliğidir ve otomatik olarak yapar. Şimdi düşünecek olursak, ilk Merge Join sonucunda oluşan tablo ilk anahtar olan ProductID’ye göre sıralı. Fakat ikinci Merge Join işleminde anahtar alan CategoryID olacağı için, o alana göre sıralı olması gerek. Bu işlemi nasıl gerçekleştireceğiz? Bu noktada ORDER BY işlemini gerçekleştiremeyiz. Bunun nedeni ise, ORDER BY ifadesini kullanarak bir veriyi çekebilmemiz için, o verinin öncelikle bir tabloya yazılmış olması gerek. Fakat şu an elimizdeki tablo henüz flow içerisinde, yani aşağıya doğru akmaya devam ediyor. Şu halde önümüze iki seçenek çıkıyor. Birincisi, ilk Merge Join komponentinden çıkan veriyi bir tabloya yazmak ve daha sonra o tablodan ORDER BY ifadesi ile anahtar kolona(CategoryID) göre sıralı çekmek böylece ikinci Merge Join işlemine sokmak. Lakin bunu tek data flow komponenti içerisinde yapabilmemiz mümkün değil. İkinci bir data flow komponenti açmak ve bununla beraber gerekli source ve destination komponentlerini de  yerleştirmek gerekir. Bu gereksiz derecede uzun bir işlem olacaktır. Bunun yerine ikinci alternatif ise, önceden de bahsettiğimiz gibi, Sort komponentini kullanmak. Bunun nasıl yapılacağını aşağıda göreceğiz. Birden fazla Merge Join komponenti içeren flow’larda önemli olan, mümkün olduğu kadar ORDER BY ifadesi ile performansı yormamak, geriye kalan zorunlu sıralama işlemlerini ise Sort komponenti ile yapmak. Sort komponentini aşağıdaki şekilde ekleyelim:

MRGJ_step9

Sort komponentinin içerisini ise aşağıdaki gibi düzenleyelim:

MRGJ_Step10

Gördünüz gibi sıralama anahtarı olarak CategoryID kolonunu gösterdim. Bu işlemden sonra da ikinci Merge Join komponentini ekleyip içerisini de aşağıdaki gibi düzenledim:

MRGJ_Step11

MRGJ_Step12

Bu şekilde ana veri setine ikinci kolonu da ikinci Merge Join komponenti ile düzgün bir biçimde ekledik. Merge Join’e dair bilinmesi gereken bir özelliği daha bu noktada ekleyelim. Merge Join komponenti “case-sensitive” bir komponenttir. Yani, join işleminin doğru bir şekilde yapılabilmesi için, eşleşecek olan verilerin harflerinin büyüklük-küçüklük durumu tutarlı olmalıdır ki, eşleşmede herhangi bir problem çıkmasın.

Üstte gerçekleştiğimiz gibi son aşamayı da tamamlayalım. Suppliers tablosuna gidip CompanyName kolonunu(tedarikçi firmanın adı) veri setimize ekleyelim. Bu noktada aynı işlemleri detaylı olarak anlatmama gerek yok. Flow’umuzun son hali aşağıdaki gibi olacak.

Last_One

Yukarıda Merge Join ve Sort komponentlerini işaretledim. Son Merge Join’den gelen final veri setimizi ise Northwind veritabanında yeni açtığım OrderDetails_Extended adlı bir tabloya doldurdum. Paketi çalıştırıp tabloyu inceleyelim ve istediğimiz gibi olup olmadığına bakalım.

Final

Paket başarıyla çalıştı. Tabloyu da inceleyelim:

MRGJ_FINAL_TABLE

Evet, son 2 sütuna bakarsanız tüm siparişler içerisinde en çok miktarda satılan ürünlerin artık ürün adını, bu ürünün kategorisini ve tedarikçi firmanın adını görebilirsiniz.

Merge Join ile alakalı çoğu şeye dair fikir sahibi olduk ve nasıl çalıştığını gördük. Fakat, Merge Join komponenti ile alakalı aydınlatılması gereken birkaç nokta daha var. Bunlardan birincisi, bir veri setini sadece bir kolona göre sıralamanız gerekmez. Örneğin biz ana veri setimizi önce ProductID kolonuna, sonra da OrderID kolonuna göre sıralayabilirdik. Bu sıralamayı SSIS’e tanıtmamız için ise, ProductID kolonunun SortKeyPosition özelliğine 1, OrderID kolonunun SortKeyPosition özelliğine ise 2 girmeliydik. Bir sorgu üzerinden örnek verelim:

One_Last_query

Eğer sorguyu üstteki şekilde yazarak veri setini çekseydik, SortKeyPosition özelliklerini de üstte bahsettiğimiz gibi seçmeliydik. Bu şekilde çağrılan bir veri seti yine aynı şekilde 2 kolona göre sıralanmış ve bu kolonların SortKeyPosition özellikleri de sırasıyla 1 ve 2 olarak belirlenmiş bir veri seti ile Merge Join işlemine girebilirdi. Fakat burada dikkat edilmesi gereken nokta şudur; sadece aynı SortKeyPosition değerine sahip olan kolonlar Merge Join komponenti içerisinde birbirleriyle eşlenebilir ve SortKeyPosition değerleri hangi sırada verildiyse, eşleme işlemi de o sırada yapılmalıdır. Biraz karışık anlatmış olabilirim. Bir örnek vereyim. Diyelim bir veri setini üç kolona göre sıraladık ve SortKeyPosition değerlerine de 1,2 ve 3 verdik. Aynı şekilde bir başka veri setini de üç kolona göre sıralayarak onların da SortKeyPosition değerlerine 1,2 ve 3 verdik. Böyle bir senaryoda, soldaki veri setinde SortKeyPosition değeri 1 olan kolon, sağdaki veri setinde SortKeyPosition değeri 1 olan kolonla, yine aynı şekilde soldaki veri setinde SortKeyPosition değeri 2 olan kolon ise sağ tarafta SortKeyPosition değeri 2 olan kolonla eşleşir. SortKeyPosition değeri 3 olanlar için de aynı durum geçerlidir. Fakat, eğer siz SortKeyPosition değeri 2 olanları eşlemeden(onları atlayıp), 1 ve 3 olanları eşlemeye kalkarsanız, Merge Join komponenti hata verecek ve size sıralamaya uygun olarak eşlemenizi söyleyecektir.

Yazıyı bitirmeden önce, verinin sıralanması ile alakalı da bir şeyler söylemek istiyorum. Merge Join komponentinin çalışması için, içine alacağı iki veri setinin de sıralı olması gerektiğini söylemiştik. Eğer veri sıralı olmadığı halde IsSorted özelliğini True yaparsanız, Merge Join doğru çalışmaz ve işlemin sonuçlarının ne vereceği kestirilemez. Eğer string kolonları anahtar olarak kullanarak Merge Join işlemi gerçekleştiriyorsanız, bu kolonların Windows Collation’a göre sıralanmış olması gerekir. Bunu sağlamak için de, Sort komponenti kullanılabilir(bu komponent otomatik olarak Windows Collation’a göre sıralamaktadır) ya da VARCHAR veri tipinde olan kolonlar T-SQL’deki “CAST” fonksiyonu kullanılarak önce NVARCHAR’a dönüştürülür, daha sonra ORDER BY ifadesi kullanılır. Eğer bu CAST işlemini yapmadan ORDER BY ifadesi ile sıralamaya kalkarsak, ORDER BY ifadesi string veriler üzerinde SQL Server Collation’a göre sıralama yapacaktır ve bu da Windows Collation’dan farklı sonuçlar doğurabilir. Haliyle de Merge Join komponenti de beklenmeyen sonuçlar verebilir. Bizim veri setimizdeki anahtar kolonlar zaten string olmadığı için, biz böyle bir dönüştürme işlemine ihtiyaç duymadık.