MSSQL Server BCP-Bulk Copy Program

BCP (Bulk Copy Program), Microsoft SQL Server’da veri dışa aktarma (export) ve içe aktarma (import) işlemleri için kullanılan güçlü bir komut satırı aracıdır.

BCP (Bulk Copy Program), komut satırı (Command Prompt / PowerShell) üzerinden kullanılan bir SQL Server aracıdır. Herhangi bir GUI (arayüz) yoktur.

BCP , bir SQL Server tablosu veya sorgusundan gelen verileri:

  • Bir iç dosyayı dışa aktarmak (export)
  • Bir dış dosyadan SQL Server tablosuna içe aktarmak (import)

için kullanılır.

Aşağıdaki komut ile BCP komutuyla bir tabloyu txt uzantısına csv formatında atabiliriz.

-T: windows kimlik doğrulama sistemi kullanacağını söylemektedir.

Character formatında (-c) dışa aktarır

bcp AdventureWorks2015.dbo.Musteriler out "C:\BULK_INSERT\musteriler.txt" -c -t, -r\n -S S1\TEST -T

-t ifadesinden sonra ; kullanıldığı için sütünlar ; ile birbirleriyle ayarladık.

-r ifadesinden sonra satırların ! işaretinden sonra alt satıra geçmesi için -r!\n ifadesi kullanıldı.

Yukarıdaki işlemlerden sonra bir txt formatındaki dosyayı veritabanı altındaki bir tabloya atma komutu:

bcp AdventureWorks2015.dbo.Musteriler in "C:\BULK_INSERT\musteriler2.txt" -c -t; -r!\n -S .\TEST -T

Yukarıdaki komutu çalıştırmadan önce tablomuzun boş durumda olduğunu görmekteyiz.

İlk ve ikinci örneğimizde dikkat ederseniz in ve out ifadelerin kullanıldığını görmekteyiz. Bu ifade ile tablomuzun içeri ve dışarı aktarılacağını belirleriz.

Tablomuza tekrardan select çektiğimizde verilerin aktarıldığını görmekteyiz.

SELECT Sorgusu ile Export (queryout) işlemi gerçekleştirebiliriz.

bcp "SELECT Ad, Soyad, Sehir FROM AdventureWorks2015.dbo.Musteriler" queryout "C:\BULK_INSERT\musteriler3.txt" -c -t;  -S .\TEST -T

Select sorgusunda çektiğimiz kolonların belirtilen isimde ilgili klasör altında olduğunu görüş oluyoruz.

Yukarıdaki işlemleri windows auth. ile yapmayıp sql auth. ile yapmaya çalışırsak aşağıdaki komut kullanılmaktadır.

-T (Windows auth) yerine -U ve -P ile SQL Login kullanılır.

bcp AdventureWorks2015.dbo.Musteriler out "C:\BULK_INSERT\musteriler4.txt" -c -S S1\TEST -U BULKLOGIN -P 1

Parametrelerin Anlamı:

ParametreAçıklama
inVeri dış dosyadan tabloya aktarılır
outTablo dış dosyaya aktarılır
queryoutSELECT sorgusunun çıktısı dosyaya yazılır
-cCharacter (varsayılan) format (tüm alanlar düz metin)
-nNative format (SQL Server’ın dahili binary biçimi)
-NUnicode native format (NCHAR/NVARCHAR için)
-wUnicode character format (UTF-16)
-tAlan ayırıcı (default: tab \t)
-rSatır ayırıcı (default: newline \n)
-SSunucu ve instance adı
-dVeritabanı adı (opsiyonel, çoğu zaman gerekmez)
-TWindows Authentication
-U / -PSQL kullanıcı adı ve şifre
-F / -Lİlk ve son satır (satır aralığı seçimi)
-eHatalı kayıtları yazmak için hata dosyası
-kNULL değerleri korunur
-b 10001000 satırda bir commit (batch) yapılır

Son olarak BCP komutunda belirli bir aralıktaki verileri almak için aşağıdaki komut kullanılmaktadır.

bcp "SELECT Ad, Soyad, Sehir FROM AdventureWorks2015.dbo.Musteriler Where MusteriID <=10" queryout "C:\BULK_INSERT\musteriler5.txt" -c -t, -S .\TEST -T

Select ifadesinden sonra hangi verileri almak istiyorsak verilerimiz o şekilde alına bilinmektedir.

AvantajAçıklama
Çok hızlıdırMilyonlarca satırı saniyeler içinde aktarabilir. Minimal işlem yapar.
Hafif ve kurulumsuzbcp.exe komut satırından doğrudan çalışır. Arayüze ihtiyaç yok.
Dışa ve içe aktarma yapabilirVerileri .txt, .csv, vs. dosyalara kolayca dışa aktarır veya içe alır.
Sorgu destekler (queryout)Filtreli, sütun seçmeli export mümkündür.
Büyük veriler için idealdirDüşük bellek kullanımı ve batch yükleme özelliği sayesinde sistem kaynaklarını zorlamaz.
Format dosyası ile esneklikÖzel veri yapıları için .fmt dosyası ile kontrol sağlanabilir.
Otomasyona uygundurPowerShell, batch script, SQL Agent job ile kolayca otomatikleştirilebilir.

BCP, SQL Server ile veri kaynağı (dosya sistemi) arasında en az katmanla ve doğrudan erişimle veri taşıdığı için çok hızlıdır. BCP, SQL Server’ın ODBC (veya OLE DB) üzerinden doğrudan veri taşır. GUI (arayüz), SSMS, ORM (Entity Framework, LINQ) gibi katmanlar kullanılmaz. BCP, veriyi satır satır değil, batch (örneğin 1000 satır) olarak işler. Bu sayede disk ve ağ I/O verimliliği artar. BCPişlemleri varsayılan olarak minimal logging ile çalışır. Özellikle TABLOCK ve SIMPLE recovery mode altında, log yazımı azaltılır.

YöntemHız (Göreli)Açıklama
bcp⚡⚡⚡⚡⚡En hızlısı
BULK INSERT⚡⚡⚡⚡Neredeyse aynı hızda
SSIS⚡⚡⚡Esnek ama daha ağır
SSMS Import Wizard⚡⚡GUI, yavaş
INSERT döngüsüSatır satır işlem – yavaş
DezavantajAçıklama
Arayüzü yoktur (CLI)Sadece komut satırından çalışır. Hatalar, format sorunları anlaşılması zor olabilir.
Hata ayıklama zordurDosya formatı veya veri tipi uyuşmazlıklarında detaylı açıklama vermez.
Yalnızca tablo veya SELECT sorgusu desteklerJOIN, GROUP BY, ORDER BY gibi karmaşık SQL işlemleri zor uygulanır.
Veri dönüştürme işlemleri zayıftırCAST, CONVERT, encoding gibi işlemler için ek sorgular gerekir.
Hassas veri aktarımında dikkatli olunmalıVeriler düz metin halinde yazılırsa güvenlik açığı olabilir. Şifreler açık geçilebilir (-P).
Veri bütünlüğü kontrolü yokturPrimary key, foreign key, check constraint gibi kurallar ihlal edilebilir.
SSMS’e göre daha teknik bilgi gerektirirÖzellikle format dosyası, terminatörler, karakter setleri dikkat ister.

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

“Namazı dosdoğru kılın, zekatı verin; önceden kendiniz için hayır olarak neyi takdim ederseniz, onu Allah Katında bulacaksınız. Şüphesiz Allah, yaptıklarınızı görendir.” Bakara Suresi, 110. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

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