MSSQL Server BULK INSERT Kullanımı

Bulk İnsert komutu işletim sistemi üzerinde bulunan düz metin dosyasından (örneğin CSV), SQL Server tablosuna doğrudan veri okur ve yükler.

İlk olarak veritabanımızın üzerinden bir csv dosyası oluşturalım. Csv formatında veri oluşturmak için MSSQL Server’dan CSV Formatında Veri Çıkarma makalesi okunabilir.

İlgili makale okunarak sizde aşağıdaki ekran resmindeki gibi herhangi bir dosyaya csv uzantısında veri kaydedebilirsiniz.

Verilerimizin aktarıldığı dosyamızın içerisinde verilerin olduğu görülmektedir.

Bu makalede yapacağımız Bulk Insert komutunu kullanmayıp SSMS üzerinden insert işlemi yapabiliriz. Bu işlemin nasıl yapıldığını görmek için ilgili makale okunabilir.

Bu text dosyasını veritabanında bir tabloya kaydetmek için  kolonların yapısı ve türüyle aynı olan bir tablo oluşturuyoruz. Farklı bir veritabanı altında oluşturuyorum.

use BULKDB_Arsiv
CREATE TABLE [dbo].[DB1_Musteriler](
	[MusteriID] [int] IDENTITY(1,1) NOT NULL,
	[Ad] [nvarchar](50) NULL,
	[Soyad] [nvarchar](50) NULL,
	[UrunAdi] [nvarchar](100) NULL,
	[Fiyati] [decimal](10, 2) NULL,
	[Sehir] [nvarchar](50) NULL,
	[Tarih] [nvarchar](50) NULL
) ON [PRIMARY]

Not: Verilerinizin kaydedileceği yeni tabloda primary olan kolonun kaldırılması gerekmektedir. Ayrıca tarih kolonu aktarımda yaşanan sıkıntıdan dolayı tür değişimi yapıldı. Daha sonra convert veya cast işlemiyle dönüşüm işlemi yapılabilir.

Şimdi csv formatımızda olan verilerimizi Bulk Insert komutuyla tablomuza aktarmış olalım. Bunun için aşağıdaki komut kullanılmaktadır.

BULK INSERT [BULKDB_Arsiv].[dbo].[DB1_Musteriler]
FROM 'C:\BULK_INSERT\BulkInsertFile.txt'
WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  -- Sütunlar arasındaki ayırıcı
    ROWTERMINATOR = '|\n',   -- Satır sonu
    CODEPAGE='1254',
    TABLOCK,
    KEEPNULLS -- Boş alanlar NULL olarak kalır
);

Şimdi yukarıdaki kodumuzun satırların ne işe yaradığını görelim.

FIRSTROW = 2 =>1. satır başlık, 2. satırdan başla anlamındadır. Başlık satırımız olmasaydı bu kolonumuz eklenmezdi.

\n: Yeni satır anlamına gelmektedir. Bir aşağı anlamına gelmektedir. | karakterinden sonra kullanılması gerekmektedir. Bir başka kullanım şekli |\r\n‘dir.

Not: \t tab komutuna karşılık gelmektedir.

TABLOCK: Daha hızlı yükleme için tabloyu kilitler (performans artışı sağlar)

CODEPAGE=’1254′: Türkçe karakter sorunu yaşamamak için kullanılır.

İlgili kullanıcımız yukarıdaki kodu çalıştırdıktan sonra aşağıdaki ekran resmindeki gibi hata mesajı almış olur.

Bulk Insert yapacağımız kullanıcının veritabanı üzerinden insert yetkisi olmadığını göstermektedir.

İlgili kullanıcıya insert yetkisi verdikten sonra tekrardan bulk işlemini gerçekleştirdiğimizde sunucu düzeyinde ilgili kullanıcının bulk işlemini aktif etmemiz gerekmektedir. Bu yetki ADMINISTER BULK OPERATIONS  yetkisidir.

Bu işlemler sonucunda tekrardan bulk insert komutunu çalıştırdığımızda verilerimizin yeni veritabanı altındaki tabloya kaydedildiğini görmüş oluyoruz.

Tablomuz çok büyük belirli satırları yükleme işleme arşiv veritabanına yapılacaksa kod aşağıdaki gibi olmalıdır. Ayrıca hata mesajları ile ilgili önlem alabiliriz.

BULK INSERT [BULKDB_Arsiv].[dbo].[DB1_Musteriler2]
FROM 'C:\BULK_INSERT\BulkInsertFile.txt'
WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  -- Sütunlar arasındaki ayırıcı
    ROWTERMINATOR = '|\n',   -- Satır sonu
    LASTROW = 501, -- 2.satırda başla 501. satırdan önceki verileri al 
    CODEPAGE='1254',
    TABLOCK,
    KEEPNULLS, -- Boş alanlar NULL olarak kalır
    MAXERRORS = 100, -- Belirli sayıda hatayı tolere et
    ERRORFILE = 'C:\hata_satirlari.txt' -- Hatalı satırları kaydet
);

Arşivleme işlemi yapıldıktan sonra gerçek veritabanındaki değerler silinmiş olur.

Bu makalemizde bulk insert komutunu detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“İnsanlara merhamet etmeyene Allah merhamet etmez.” (Müslim)

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir