SQL Sorgu Sonucunu CSV veya Excel Dosyasına Aktarma
Beceri rehberi

SQL Sorgu Sonucunu CSV veya Excel Dosyasına Aktarma

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Sorgu sonucunu Excel'de kullanmak için çoğu zaman CSV dosyası üretmek yeter. SQL Server'da bcp, PostgreSQL'de COPY ile bunu nasıl yapacağınızı ve Excel'de açarken karşılaşılan Türkçe karakter, ayırıcı ve baştaki sıfır sorunlarının çözümünü görürsünüz.

Bir bakışta

  1. Excel'e aktarmanın en sağlam yolu CSV dosyasıdır. Tek seferlik işte arayüzdeki dışa aktarma yeter; tekrarlanan işte komut satırı aracı ya da betik kullanılır.
  2. SQL Server'da bcp queryout bir sorgunun sonucunu dosyaya yazar. Varsayılan alan ayırıcısı sekmedir; virgül gerekiyorsa ayrıca belirtilir.
  3. PostgreSQL'de COPY (sorgu) TO ... WITH (FORMAT csv, HEADER) kullanılır. Sunucu tarafındaki COPY dosyayı sunucuda yazar; kendi bilgisayarınıza yazmak için psql'in \copy komutu gerekir.
  4. Sorunların çoğu dosyada değil, Excel'in dosyayı açış biçimindedir. Karakter kodlaması, liste ayırıcısı ve sayı gibi görünen metinler Excel'de bozulabilir.

Önce sorguyu dışa aktarmaya hazırlayın

Dışa aktarılan dosya, sorgunun çıktısını olduğu gibi taşır; bu yüzden düzeltilecek her şey aktarmadan önce sorguda yapılmalıdır. Kolonlara okunabilir takma adlar verin, çünkü başlık satırında bu adlar görünür:

SELECT m.ad AS musteri_adi, m.sehir AS sehir, s.toplam AS siparis_toplami FROM musteri AS m JOIN siparis AS s ON s.musteri_id = m.musteri_id ORDER BY m.ad;

Select * ile her şeyi aktarmak yerine yalnızca alıcının ihtiyaç duyduğu kolonları seçin. Bu hem dosyayı küçültür hem de yanlışlıkla kişisel verinin paylaşılmasını önler. Tarihleri ve ondalık sayıları dışarıya nasıl çıkacağından emin olmak için gerekirse açıkça biçimlendirin. NULL değerlerin dosyada nasıl görüneceğini de düşünün: boş hücre mi, "NULL" yazısı mı olacak?

Sıralama aktarma sırasında korunur, ama dosyayı okuyanın bunu varsaymaması gerekir. Tekrar üretilecek raporlarda sorguyu bir görünüm (view) içine alıp aktarmayı her seferinde aynı tanımdan yapmak tutarlılık sağlar. Dosyanın kaç satır üretmesi gerektiğini kaynak sorguda önceden bilmek, aktarma sonrası doğrulamayı kolaylaştırır.

Hangi aracı seçmeli?

Doğru yöntem, işin tek seferlik mi yoksa tekrarlanan mı olduğuna ve çalıştığınız sisteme bağlıdır. Tek seferlik küçük bir rapor için yönetim aracının arayüzündeki sonuçları dosyaya kaydetme seçeneği yeterli ve en hızlı yoldur. SQL Server Management Studio gibi araçlar sonuç tablosundan CSV üretebilir; menü adları sürüme göre değiştiği için kendi sürümünüzün belgesine bakın.

Tekrarlanan, zamanlanmış ya da çok satırlı işlerde komut satırı aracı gerekir. SQL Server için bcp, PostgreSQL için COPY komutu bu işin standart araçlarıdır. İkisi de betiğe konabilir, böylece dışa aktarma bir görev zamanlayıcıyla düzenli çalışır. MySQL ve MariaDB'de de sorgu sonucunu dosyaya yazan bir söz dizimi ve komut satırı yolu bulunur; ayrıntı sürüme göre değiştiği için belgede kontrol edilmelidir.

Veri çok büyük ya da hassassa, dosyaya yazmak yerine uygulama kodundan okuyup hedef sisteme doğrudan aktarmak da bir seçenektir. Dosyada bırakılan kişisel veri, yetkisiz kişilerin eline geçme riski taşır.

Şekil 1

Aracı iş tipi ve sistem belirler

Dışa aktarma yöntemi seçimi

Dışa aktarma nasıl bir iş?
  1. Tek seferlik, küçük bir raporYönetim aracının arayüzüSonuç ızgarasından dosyaya kaydedilir.
  2. SQL Server, tekrarlanan ya da büyük aktarımbcp queryoutBetiğe konabilir, zamanlanabilir.
  3. PostgreSQL, dosya sunucuda kalabilirCOPY (sorgu) TOSunucu dosya yetkisi gerekir.
  4. PostgreSQL, dosya kendi bilgisayarınızda olacakpsql \copyDosya istemcide yazılır, sunucu yetkisi gerekmez.
Kaynak: PostgreSQL COPY ve Microsoft bcp belgeleriMindset Institute

PostgreSQL ile COPY ve \copy

PostgreSQL'de sorgu sonucu doğrudan dosyaya yazılabilir. COPY komutuna tablo adı yerine parantez içinde bir sorgu verilir, biçim olarak csv seçilir ve başlık satırı istenir:

COPY ( SELECT ad AS musteri_adi, sehir FROM musteri WHERE sehir = 'İzmir' ) TO '/tmp/musteri.csv' WITH (FORMAT csv, HEADER);

PostgreSQL belgesine göre HEADER açıkken ilk satıra sorgunun çıktı kolon adları yazılır; bu yüzden takma adlarla başlıkları denetleyebilirsiniz. CSV biçimi virgülle ayırır, çift tırnakla sarmalar ve değerin içindeki tırnağı katlar. Metinde virgül varsa değer otomatik olarak tırnağa alınır; böylece Excel hücreleri doğru ayırır. NULL değerler tırnaksız boş olarak yazılır, boş metin ise çift tırnak çiftiyle gösterilir. Belirli kolonların her zaman tırnaklanması için FORCE_QUOTE kullanılabilir.

Önemli bir ayrım: COPY komutu dosyayı veritabanı sunucusunda, sunucu sürecinin yetkisiyle yazar. Bu nedenle sunucu dosyalarına yazma yetkisi gerekir ve dosya sizin bilgisayarınızda değil sunucuda oluşur. Kendi bilgisayarınıza yazmak istiyorsanız psql içinde \copy komutunu kullanın:

\copy (SELECT ad, sehir FROM musteri) TO 'musteri.csv' WITH (FORMAT csv, HEADER)

\copy, dosyayı istemci tarafında psql aracılığıyla yazar; dosya erişimi ve yetkiler sunucuya değil, sizin bilgisayarınıza bağlıdır ve normal tablo yetkileri yeterlidir.

SQL Server ile bcp queryout

bcp, SQL Server örneği ile bir veri dosyası arasında toplu kopyalama yapan komut satırı aracıdır. Sorgu sonucunu dosyaya yazmak için tablo adı yerine çift tırnak içinde bir sorgu verilir ve yön olarak queryout seçilir:

bcp "SELECT ad, soyad, sehir FROM satis.dbo.musteri" queryout musteri.csv -c -t, -S sunucu_adi -T

Belgeye göre sorguda çift tırnak dışarıda, içerideki metin değerleri tek tırnakla yazılır; sorgu birden çok sonuç kümesi döndürürse yalnızca ilki dosyaya yazılır. -c karakter biçimini, -t alan ayırıcıyı seçer; varsayılan ayırıcı sekmedir, virgülle ayırmak için -t, yazılır. -S sunucuyu, -T tümleşik Windows kimlik doğrulamasıyla güvenilir bağlantıyı belirtir. Kimlik doğrulama için kullanıcı adı ve parola gerekiyorsa -U ve -P kullanılır ama parolayı komut satırına ya da betiğe yazmak yerine istendiğinde girmek daha güvenlidir.

Bcp ile dışa aktarmak için kaynak tabloda SELECT yetkisi yeterlidir. Yazıldığı hâliyle bcp, değerleri tırnağa almaz; metin içinde virgül geçen bir kolon CSV'yi bozar. Böyle durumlarda farklı bir ayırıcı seçmek ya da sorgudaki metni tırnakla sarmalamak gerekir. Başlık satırını bcp kendiliğinden yazmaz; başlık gerekiyorsa sorguyla eklemek ya da dosyayı ayrıca düzenlemek gerekir. Kodlama konusunda -c karakter biçimidir; Unicode ve Türkçe karakter gerektiren dosyalar için -w ya da kod sayfası seçeneklerine belgeden bakın.

Excel'de açarken Türkçe karakter, ayırıcı ve baştaki sıfır

Dosya doğru üretildiği hâlde Excel'de bozuk görünüyorsa neden çoğunlukla birkaç yerden birindedir.

  • Türkçe karakter bozuksa kodlama uyuşmuyordur. Excel'in dosyayı hangi kodlamayla okuduğu sürüme ve açış yöntemine göre değişir. Metin içe aktarma sihirbazıyla açıp kodlamayı seçmek ya da dosyayı Excel'in beklediği kodlamayla kaydetmek çözümdür.
  • Tüm veri tek sütuna sığıyorsa liste ayırıcısı uyuşmuyordur. Türkçe bölgesel ayarlarda Excel genellikle noktalı virgül bekler; virgülle ayrılmış dosyada ayırıcıyı seçmek gerekir.
  • Telefon numarasındaki baştaki sıfır ya da uzun kimlik numarası kayboluyorsa Excel sayı sanıp değiştirmiştir. İçe aktarırken o kolonu metin olarak işaretleyin.

Bu ayrıntılar bölgesel ayara ve Excel sürümüne bağlı olduğu için alıcıyla aynı biçimde açılıp açılmadığını bir örnek dosyayla denemek en güvenlisidir. Dosyayı sık paylaşıyorsanız ayırıcıyı ve kodlamayı bir kez kararlaştırıp belgeleyin.

Dışa aktarma sonrası son kontrol: dosyadaki satır sayısını kaynak sorgudaki sayıyla karşılaştırın, ilk ve son birkaç satırı gözle inceleyin, kişisel veri içeren dosyayı gereksiz yerde bırakmayın. Dosyayı e-postayla göndermeden önce veri sahibinin izin verdiği kapsamda olduğundan emin olun.

Bu beceriyi Mindset programında nerede çalışırsınız?

Mindset'in SQL ile Programlama Eğitimi, Dışa Aktarma modülünde sorgu sonucunu dosyaya aktarmayı uygular. Raporlama yapan analistler için asıl kazanım, aktarmayı bir kez elle yapmak yerine tekrarlanabilir bir komuta çevirebilmektir.

Bir deneme tablosundan CSV üretip Excel'de açmak ve karakter ya da ayırıcı sorunlarını kendi ayarlarınızda gözlemlemek iyi bir başlangıçtır.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

SQL sorgu sonucunu doğrudan .xlsx olarak aktarabilir miyim?

Yönetim araçlarının bazıları sonucu doğrudan Excel biçiminde de kaydedebilir, ancak komut satırı araçları (bcp, COPY) düz metin üretir. En taşınabilir yol CSV üretip Excel'de açmaktır; gerçek .xlsx gerekiyorsa bir betik dili ya da raporlama aracı kullanılır.

bcp çıktısında başlık satırı olur mu?

bcp kendiliğinden kolon adı satırı yazmaz. Başlık gerekiyorsa sorguyla birleştirerek eklenir ya da dosyaya sonradan eklenir. PostgreSQL'de ise COPY komutuna HEADER seçeneği verildiğinde ilk satıra kolon adları yazılır.

PostgreSQL COPY ile \copy arasındaki fark nedir?

COPY dosyayı veritabanı sunucusunda, sunucunun dosya yetkileriyle yazar; dosya sizin bilgisayarınıza gelmez. \copy ise psql üzerinden çalışır ve dosyayı sizin bilgisayarınızda oluşturur, dosya erişimi sizin yetkinize bağlıdır. Kendi makinenize aktarmak için çoğunlukla \copy gerekir.

Excel'de Türkçe karakterler neden bozuk görünüyor?

Dosyanın kodlaması ile Excel'in dosyayı okuyuş kodlaması farklıdır. Dosyayı Excel'de metin içe aktarma ile açıp doğru kodlamayı seçmek ya da dosyayı Excel'in beklediği kodlamayla kaydetmek sorunu çözer. Sorun dosyada değil, açış biçimindedir.

Dışa aktarma işini otomatik hale getirebilir miyim?

Evet. bcp ve psql komutları betiğe yazılıp bir görev zamanlayıcıyla çalıştırılabilir. Parolayı betiğe yazmayın; bağlantı bilgisi güvenli bir yapılandırma ya da ortam değişkeniyle sağlanmalıdır. Çıktı dosyasının kimlerin erişebileceği bir yerde durduğunu da denetleyin.

SQL Sorgu Sonucunu CSV ve Excel'e Aktarma Yöntemleri