Makale Özeti

Bu makalede toplu veri giriş yöntemlerinden bulk insert kullanımını inceleyeceğiz.

Makale

Bulk Insert


TOPLU VERİ GİRİŞİ - BULK INSERT

Genelde veritabanımızı oluşturan kayıtları kullanıcılara sunduğumuz formlardan toplarız. Ama bazen farklı ihtiyaçlara cevap vermek gerekir. Örneğin işbirliği yaptığınız bir firma istediğiniz kayıtları cdye çektiği metin dosyalarında getirdi. Bu gibi durumlarda farklı tür kaynaklardan topluca veriyi veritabanımıza aktarmamız gerekir. Bulk insert bu yöntemlerden biridir. MSDN de bulk insert sözdizimi şu şekilde gösteriliyor;

BULK INSERT [ [veritabanıadi].[ sahip ] ] { tablo_İsmi FROM kaynak_dosya }
[
WITH
(
[
BATCHSIZE [ = yığın_boyutu] ]
[ [ , ]
CHECK_CONSTRAINTS ]
[ [ , ]
CODEPAGE [ = ACP | OEM | RAW | istediğimiz_sayfa_kodlaması ] ]
[ [ , ]
DATAFILETYPE [ = { char | native | widechar | widenative } ] ]
[ [ , ]
FIELDTERMINATOR [ = alan_ayracı ] ]
[ [ , ]
FIRSTROW [ = ilk_satir] ]
[ [ , ]
FIRE_TRIGGERS ]
[ [ , ]
FORMATFILE = Sekli_belirleyen_dosyanın_yolu ]
[ [ , ]
KEEPIDENTITY ]
[ [ , ]
KEEPNULLS ]
[ [ , ]
KILOBYTES_PER_BATCH [ = kilobayt/yığın ] ]
[ [ , ]
LASTROW [ = son_satir ] ]
[ [ , ]
MAXERRORS [ = hata_tepe_sınırı ] ]
[ [ , ]
ORDER ( { sütun [ ASC | DESC ] } [ , ... n ] ) ]
[ [ , ]
ROWS_PER_BATCH [ = satır/yığın] ]
[ [ , ]
ROWTERMINATOR [ = satir_ayraç ] ]
[ [ , ]
TABLOCK ]
)
]

Yukarıdaki seçeneklerden önemli olan bazılarını inceleyelim;

BATCHSIZE (Yığın Boyutu)
Bu seçenek bize yığının satır sayısını belirleme imkanı verir. Her yığın SQL Serverda farklı bir transaction olarak işlendiğinden, aslında bu seçenek ile bir hata durumunda geri alınabilir birimi belirlemiş oluruz. Bu seçeneğin varsayılan değeri belirtilen kaynaktaki tüm veriyi tek bir transaction olarak aktarmak üzere yapılandırılmıştır.

CHECK_CONSTRAINTS
Bulk insert esnasında, veritabanında önceden belirlediğimiz kısıtların etkin olup olmayacağını belirleriz. Varsayılan olarak kısıtlar bulk insert sırasında dikkate alınmazlar.
CODEPAGE [ = ACP | OEM | RAW | istediğimiz_sayfa_kodlaması ]
Bu seçenek sayesinde char , varchar , veya text tipleri için karakterlerin hangi kodlamaya göre değerlendirileceğini belirleyebiliriz.
ACP:Belirttiğimiz tipleri ANSI/Microsoft Windows (ISO 1252) kodlamasından SQL Server sayfa kodlamasına çevirir.
OEM: OEM kodlamasından SQL Server sayfa kodlamasına dönüşüm yapılır.
RAW : Herhangi bir dönüşüm yapmadığından en hızlı seçenektir.
Son olarak da istediğimiz herhangi bir sayfa kodlamasını belirtebiliriz. Türkçe için 28599 gibi.

FIELDTERMINATOR [ = alan_ayracı ]
Kaynak dosyasındaki alanları ayırmak için kullanılan ayracı belirler. Varsayılan karakter paragraftır. ( (tab) \t)

FIRSTROW [ = ilk_satir]
Bulk insert için hangi satırdan başlanacağını belirler. Varsayılan değer 1dir.

FIRE_TRIGGERS
Varsayılan olarak bulk insert işleminden sonra herhangi bir tetikleyici (trigger) ateşlenmez. Ama bu seçenekle bulk insert sonrası hangi tetikleyicinin ateşleneceğini belirtebiliriz.

KEEPIDENTITY
Kimlik (Identity ) alanının kaynak dosyadan alınıp alınmayacağını belirler. Eğer değer atanmazsa varsayılan olarak kimlik alanı kaynak dosyadan alınmaz ve otomatik olarak benzersiz kimlik numaraları atanmaya başlanır.

KEEPNULLS
Bulk insert işleminde karşılaşılan boş kayıtlar için null değerin mi yoksa tabloda belirlenmiş varsayılan değerin mi atanacağını belirler.

LASTROW [ = son_satir]
En son hangi satırın kopyalama işlemine tabi tutulacağını belirler. Varyılan değer, kaynak dosyadaki son satırı gösteren 0 dır.

MAXERRORS [ = hata_tepe_sınırı]
Kopyalama sırasında, kaçıncı hatada işlemin iptal edileceğini belirler. Varsayılan değer 10dur.

ORDER ( { sütun [ ASC | DESC ] } [ , ... n ] )
Kaynak dosyanın nasıl sıralandığını belirler. Eğer kaynak kümelenmiş dizinlere göre sıralanmış ise işlem daha hızlı gerçekleşecektir. Varsayılan olarak kaynak dosya sıralanmamış olarak kabul edilir. n sayısı sıralama için birden fazla alanın kullanılabileceğini gösterir.

ROWTERMINATOR [ = satir_ayraç ]
Yeni satırı hangi karakterin temsil ettiğini belirler. Varsayılan değer yeni satır karakteri olan \n dir.

TABLOCK
Bulk insert esnasında tablo bazında kilitleme yapılıp yapılmayacağını belirler.

Son olarak da bir örnek üzerinde bulk insert işleminin nasıl yapıldığını örnekleyelim. Bunun için aşağıdaki kodcukları query analyzer veya enterprise managerı kullanarak işletin ki örneğimizde kullanacağımız tabloyu oluşturmuş olalım.

if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[tblBulk]) and OBJECTPROPERTY(id, NIsUserTable) = 1)
drop table [dbo].[tblBulk]
GO

CREATE TABLE [dbo].[tblBulk]
(
[MusteriId] [char] (10) COLLATE Turkish_CI_AS NULL ,
[Ad] [char] (10) COLLATE Turkish_CI_AS NULL ,
[Soyad] [char] (10) COLLATE Turkish_CI_AS NULL
)
ON [PRIMARY]
GO

Böylelikle MusteriId, Ad ve Soyad sütunlarından oluşan tblBulk tablosunu oluşturmuş olduk. Şimdi bu tabloya girilmek üzere bir metin dosyası hazırlayalım. C sürücüsünün kök dizinde Musteri.txt adında bir dosya oluşturun. İçeriğini;

Must01---Ali---Rıza
Must02---Veli---Dereli
Must03---Erkam---Çankaya
Must04---Ali---Eşiyok

olacak şekilde doldurun. Buradan da anlaşıldığı üzere her alanı --- karakter dizisiyle ayrılmış bir şekilde kayıtlar belirtilmiş ve her farklı kayıt ise yeni satırda (\n) yazılmış durumda.

Şimdi bu dosyadan kayıtları tablomuza yükleyecek bulk insert komutumuzu yazalım. Ben tabloyu Northwind veritabanında oluşturduğum için,

BULK INSERT Northwind.dbo.[tblBulk]
FROM c:\Musteri.txt WITH (FIELDTERMINATOR = ---, ROWTERMINATOR = \n, CODEPAGE = 28599)

İşte bu kadar. Böylelikle metin dosyasından okuduğumuz kayıtları veritabanımıza çekmiş olduk. Yorumlarınızı bekliyorum.

Kaynaklar:
http://www.sqlteam.com
http://msdn.microsoft.com

Kâsım GÜLCAN
SQLNedir?com