SQL Server da Tablolar Arası Veri Transferi

SQL SELECT INTO - INTO SELECT


Arkadaşlar merhaba bu yazımız da sql server da, sql komutlarıyla veri transferi konusuna bakacağız.

Bilindiği gibi sql serverda veri taşımanın bir çok yolu var bunların en çok kullanılanları şüphesiz Management Studio nun export/import araçlarıdır.

Ama biz bugün daha öncede bahsettiğim gibi sql scriptleriyle halledebilmenin yollarına bakacağız.
Evet bunun için iki şekilde yapabiliriz
Önce kendimize tablo oluşturarak işe başlayalım.

CREATE TABLE [dbo].[Musteri](
[id] [int] IDENTITY(1,1) NOT NULL,
[Adi] [varchar](50) NULL,
[Soyadi] [varchar](50) NULL,
[Telefon] [varchar](20) NULL
) ON [PRIMARY]

Tablomuzu oluşturduk sıra veri girmeye geldi.

INSERT INTO [dbo].[Musteri] ([Adi],[Soyadi],[Telefon])
VALUES ('Ahmet','CAN','0532988888')

Siz dilediğiniz sayıda kayıt ekleyebilirsiniz.

Şimdi hazırlıklar tamamlandığına göre data transferine başlayabiliriz.

I. Yöntem:
SELECT * INTO Yeni_Musteri FROM Musteri

Bu yöntem de Musteri tablosunda ki kayıları select eder ve Yeni_Musteri adında yeni bir tablo oluşturur ve select ten gelen veriyi insert eder.

Burada SELECT işlemi bildiğimiz sorgulama işlemidir. Belli kriterlere sahip veriyi aktarmak isteyebilirsiniz bunun için WHERE yazmamız yeterli olacaktır.

II. Yöntem:

INSERT Yeni_Musteri2 (Musteri_Adi, Musteri_Soyadi)  SELECT Adi,Soyadi FROM [Musteri] 

Bu yöntemde de zaten var olan bir tablonun içine belli alanları eşleyerek insert yapıyoruz. Yine Select kısmına filtre uygulayabiliriz.
 Burada dikkat edilecek bir husus var.  Eşleştirilecek kolonlar aynı sırayla yazılması gerekiyor yani kaynak alan ve hedef alan aynı sırada olmalı. 

Diğer bir önemli noktada; dikkat ederseniz biz bu yöntemde ID alanlarını taşımadık. Bildiğiniz gibi IDENTITY alanlara kayıt yapamıyor ve düzenleyemiyoruz. 
Peki ID numaralarıyla birlikte taşımak istersek ne yapmamız gerekiyor?

Çözüm:

IDENTITY alanlarının müdahaleye açık hale getiriyoruz.

SET IDENTITY_INSERT Yeni_Musteri2 ON 
            INSERT Yeni_Musteri2 (ID, Musteri_Adi,Musteri_Soyadi)  SELECT ID, Adi,Soyadi  FROM [Musteri] 
SET IDENTITY_INSERT Yeni_Musteri2 OFF


Son olarak bir tavsiye de bulunmak istiyorum. Bu transfer işlemlerinde transaction çalıştırarak yapın. Bir sıkıntı oluşacak olursa uzun aktarım işlemi tekrardan yapmak zorunda kalmazsınız ve veri tutarlılığını korumuş olursunuz. Transaction konusunu da ayrıca ele almayı düşünüyorum.

Faydalı olması dileğiyle.


SQL COALESCE Kullanımı


Merhaba arkadaşlar zaman buldukça yine bir şeyler paylaşmaya çalışacağım.
Bu yazımızda da sql COALESCE fonksiyonundan  çok kısa bir şekilde bahsetmek istiyorum.

Bildiğiniz gibi sql de boşla NULL aynı şey değil. Bazı durumlarda kolonun kesinlikle bir değer döndürmesini isteriz. Bunun için Null kontrolü yapmak zorunda kalırız. Bunlardan en bariz örneği olarak matematiksel işleri verebiliriz. Hata almamak işlemin durumuna göre kontrol ederek uygun bir değerin gelmesini sağlarız.
Peki bugüne kadar ISNULL yöntemini kullandık farkı nedir?
Farkı şudur arkadaşlar; ISNULL() makalesinde de gördüğünüz gibi  iki parametreyle çalışır, COALESCE  ise birden fazla parametreyle çalışır ve eğer kolon null ise null olmayan ilk parametreyi getirir.
Hemen bir örnekle konuyu toparlayalım.

Kullanımı:
SELECT COALESCE (KoloAdi,'Null sa gelecek bir değer-1 ','Parametre-1 Null sa gelecek bir değer-2',...devam eder...,)

Örnek:
SELECT COALESCE(MusteriKodu,PeroselKodu,'yok')  FROM [dbo].[StokHareket] 

Eğer MusteriKodu null ise PersonelKodunu getirir oda null ise yok yazar. Bu şekilde birden çok kolona göre kontrol yapabilirsiniz ve bazen hayat kurtarır.

Son olarak performans dan da bahsederek bitirmek istiyorum yazıyı.
Tabiki diğer fonksiyonlar gibi sorugulara maliyet yüklüyor ve isnull() fonksiyonuna göre biraz daha yavaş olduğunu gözlemledim. Yanılıyorsam burada doğru sonuçları paylaşabilirsiniz.

Sonra ki bir yazımda görüşmek üzere...