SQL Update Join Kullanımı



Merhaba bu yazımızda çok işinize yaracak bir Update kullanım şeklini anlatacağım.

Bizim kadar çok kayıt düzeltmesi yapıyorsanız kesinlikle ihtiyacınız olacak ve hayat kurtaracaktır.
Sorgularda kullandığımız Join syntax ı aynen geçerlidir. Önce syntax ı verelim sonra da örnekle bitiririz.

Kullanımı:

UPDATE 
table1  SET kolon1 = ifade 
FROM tablo1  
INNER JOIN tablo2 ON tablo1.kolon1 = tablo2.kolon1
WHERE kriter


Örnek:

Bu örnekte Sipariş tablosundaki Sevk Tarihi ile Sevkıyat  tablosundaki tarihlerin uyumsuz olanları eşitledik

UPDATE 
Siparis SET SevkTarihi = Sevkiyat.Tarih 
FROM Siparis
INNER JOIN Sevkiyat ON Siparis.ID = Sevkiyat.SiparisID
WHERE Sevkiyat.SevkTarihi != Sevkiyat.Tarih


Konu bu kadar kolay.

SQL Hata Çözümü - Cannot open user default database. Login failed. Login failed for user



Arkadaşlar merhaba;

Bu yazımızda SQL ile ilgili çok sık olmasa karşılaşabileceğimiz bir hatanın çözümüne bakacağız.

"Cannot open user default database. Login failed. Login failed for user" 



      SQL Hatası derken baştan söyleyelim bu hatanın sebebi yüksek ihtimalle bizden kaynaklıdır.
Yani kullanıcı ya varsayılan olarak atanan Database in silinmesinden kaynaklı bir hata.

Çözümüne gelecek olursak hızlıca anlatalım.

1. Adım: Kullanıcı giris ekranının da Options (Seçenekler) butonuna basıyoruz.


2. Adım: Connetion Properties (Bağlatı Özellikleri) sekmesine gidiyoruz.

,
3. Adım: Data sonra database listesinden istediğiniz bir database i seçebilirsiniz. Ben gelde  master veya msdb veritabanlarından birini seçiyorum.



4. Adım: Son olarak Login (Giriş)  yapabilirsiniz. 

İşlem tamam... umarım işinize yarar.





SQL Server Linked Server Kullanımı ve Dağıtık Sunuculara Erişim

Arkadaşlar merhaba;
Bu yazımızda elimizden geldiğince SQLde Linked Servers ve Dağıtık Sunuculara Erişim konusunu anlatmaya çalışacağız.

İsterseniz önce Distributed Systems olarak da anılan  Dağıtık Sunucu (Sistem) nedir? bunu özetlemekle başlayalım.

 Dağıtık Sistemler (Distributed Systems)


       En basit özet anlatımıyla, çeşitli iletişim protokolleriyle erişebildiğimiz, üzerin de veri barındıran farklı konumlara sahip veri kaynaklarıdır.

       Bu veri kaynakları aynı sunucu üzerinde farklı path larde bulunabileceği gibi farklı sunucular üzerinde hatta dünyanın farklı  ülkelerinde bile bulunabilirler. Üstelik bu kaynakların aynı türde de olmayabilirler. Verilerin bir kısmı SQL server üzerinde tutulurken bir bunu destekleyen başka bir veri başka bir sunucuda, Excel ya da Text dosya üzerinde olabilir. Zaman zaman bu verilere erişip bir araya getirerek aynı amaç doğrultusun da birleştirip anlamlı veriler ya da raporlar oluşturmamız beklenir.

İşte bu noktada Linked Servers devreye girer ve bize bu farklı yapılar arasında iletişim imkanı sunar.

Not: Dağıtık Sistemler aynı zaman da BigData konusuna da girer. BigData çok başka bir konudur karıştırılmalıdır Detayları için araştırmanızı tavsiye ederim.

Konuyu detaylı olarak açıklayan makale örnekleri de mevcut, biz anlaşılır bir dille özetlemeye çalıştık.


 Linked Servers

Linked Servers yöntemi temel olarak OLEDB veya ODBC protokolleriyle erişim sağlar.

Dilerseniz artık yavaş yavaş serverlar arası link kurarak verileri erişmeye başlayalım.

Linked Server oluşturmanın iki yolu vardır. 
Bunlarda birisi SQL Server Management arayüzünden sihirbazlarla oluşturmak,
diğeri ise SQL içerisinde mevcut olan  Stored Procedure kullanarak oluşturmak.


Object Explorer/Server Objects/Linked Servers/New Linked Server














Yolu izlediğiniz de Tanım ekranı çıkar.

































Resimde zaten alanların ne olduğu nasıl doldurulacağı belirtildi.
        Peki elimizi kolumuzu sallayarak servere erişemeyeceğimize göre Kullanıcı adı ve parolayı nereye gireceğiz.
Evet doğru!!!  Security sekmesinden Kullanıcı ve Parolanızı girmeniz gerekiyor.
Ayrıca diğer bazı ayarlar içinde Server Options sekmesine göz atmanızı tavsiye ederim. Ne oldukları açık oldukları için tek tek değinmiyorum.

Eğer bütün ayarlarımız tamam sa OK diyerek kaydediyoruz.

        Son olarak oluşturduğumuz Linked Server'in üzerinde sağ tuş "Test Connection" diyerek testini yapıyoruz ve işi bitiriyoruz.



C# Environment Sınıfı Kullanımı



Arkadaşlar merhaba bu yazımızda hayli işe yarayan Environment Class ını inceleyeceğiz.

Bu sınıf adında anlaşıldığı gibi Environment Variables yani Ortam Değişkenleri adı verilen bilgilere ulaşmanın en kısa yoludur.
Peki ortam değişkenleri denildiğinde ne anlamalıyız.
Bunlar resimde de gördüğünüz yazılımlara sistem path leri ve parametreleri hakkında bilgi veren, işletim sisteminin neyi nerede barındıracağı bilgisini tutan değişkenlerdir. Örnek olarak TEMP klösörü, Desktop vs... nerede gibi daha bir çok bilgi içerir.
Burada değişken denilmesinde ki sebep gerçekten değiştirilebilir yani eklenebilir silinebilir ve değiştirebilir olmasıdır. Özel sebeplerden dolayı sistem yönetici bu değişikliğe gidebilir.
Bu ekrana da Win8 için Bilgisayarım/Özellikler/Gelişmiş sistem ayarları/Ortam değişkenleri yolunu izleyerek ulaşabilirsiniz.



















İsterseniz şimdi makalenin konusu olan .Net (C#) içerisinden bu bilgileri nasıl ulaşabiliriz ona bakalım.

İşimiz çok kolay System namespace altında bulunan Environment Sınıfını işe dahil etmek yeterli.
Bu sınıf static olduğu için herhangi bir instance almaya gerek yok direk kullanabiliriz.
Peki bize hangi bilgileri veriyor açıklayarak sıralayalım.

  Environment.CommandLine; //Uygulanın çalıştırıldıgı komutsatırı
  Environment.TickCount//Sistem başladığından beri geçen milisaniye sayısı
  Environment.StackTrace//Uygulama çalıştırıldıgında oluşan StackTrace dediğimiz bilgileri verir. Bu bilgiler aynı zaman da visual studia ekrana yansıyan hatalarda ki StackTrace bilgisidir.
   Environment.SystemDirectory; //Sistem dizinin tam yolunu (C:\Windows\system32) verir.
   Environment.UserDomainName//Kullanıcı Domain Adı.  
   Environment.Version//CLR versiyon numarası
   Environment.OSVersion.VersionString; //İşletim sistemi 
   Environment.UserName//Kullanıcı adı
   Environment.MachineName; //PC adı
   Environment.CurrentDirectory; //Uygunlamamnın çalıştıgı aktif klasör yolu
   Environment.ProcessorCount//Çekirdek sayısı

Environment.SpecialFolder Enum unu kullanarak bir çok özel klasöre erişebilirsiniz.
Ben hepsini tek tek sıralama gereği duymadım ne oldukları zaten açık.
Örnek olarak ;
Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //Masaüstü yolunu verir.

Ayrıca;

Environment.SetEnvironmentVariable("değişken", "değer"); ile değişkenlere değiştire bileğinizi belirtmek istiyorum. Ben bu metodu hiç kullanmadım dip not olarak vereyim.

Faydalı olması dileğiyle...



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...


C# Tarih Fonksiyonları



Merhabalar aslında bu makaleyi yazarken amacım hangisi nedir yerine bu metodların ihtiyaç durumlarına göre kullanımlarına  örnekler vermekti. Ama konu o kadar geniş ki bunu daha sonra ki bir zamana erteleme kararı aldım. Ee başlamışken birşeyler anlatarak konuya girmiş olalım.

DateTime dt = DateTime.Now;
DateTime dt2=new DateTime(2011,1,1);

İki tarih arasında ki farkı bulmak:
İki tarihideki fark Subtract() metoduyla bulunur ve TimeSpan tipinden değer döndürür.

TimeSpan tSpan = dt.Subtract(dt2);

İsterseniz TimeSpan olarak dönen değerle şimdi neler yapabiliriz inceleyelim.
Aşagıdaki örneklerde farkı gün saat gibi int tipinden alabildiğimizi görüyoruz.

tSpan.Days;
tSpan.Hours;
tSpan.Minutes;
tSpan.Seconds;

belli başlı özellikleri ele aldık eğer inceleresenizdaha fazlası oldugunu göreceksiniz.

Tarihin belli bölümlerini alabiliriz.

dt.Day; Tarihin gün değerini int tipinden döndürür
dt.Month; Tarihin ay değerini int tipinden döndürür.
dt.Year; Tarihin yıl değerini int tipinden döndürür.

Saat dakika saniye cinsinden properties lerin oldugunu artık söylemeye gerek yok sanırım.

Tarih ekleme çıkarma:

dt.AddDays(1); Güne 1 ekledik
dt.AddDays(-1); Gün degerini 1 eksilttik yani düne gittik
dt.AddHours(1); Saate 1 ekledik
dt.AddHours(-1); Saati 1 eksilttik
Ay, yıl, dakika, saniye gibi işlemleri kendiniz deneyebilisiniz.
Sizde fakedeceksiniz ama yinede değinmeden geçmiş olamayalım. Saniye, dakika, gün gibi özeliklere yapılan ekleme ve çıkarmalar direk olarak eğer gün ise tarihin yıl kısmınıda etkileyecektir. Yani 31.12.2010 tarihine 1 gün eklerseniz 01.01.2011 tarihine dönecektir. Aynısı dakika, saat gibi özellikler içinde geçerlidir.

Tarih Formatlama :

Zaman zaman tarihleri farklı formatlarda almak isteriz. Şimdi bunu nasıl yapabiliriz inceleyelim. Uygulanan formatlar ve döndürdükleri string degerler aşağıda yanyana gösterilmekte.

dt.ToString("t");  23:29
dt.ToString("r");  Wed, 04 May 2011 23:29:09 GMT
dt.ToString("T");  23:28:30
dt.ToString("m"); 04 Mayıs
dt.ToString("G");  04.05.2011 23:26:10
dt.ToString("g");  04.05.2011 23:25
dt.ToString("F");  04 Mayıs 2011 Çarşamba 23:24:42
dt.ToString("f");  04 Mayıs 2011 Çarşamba 23:24
dt.ToString("D");  04 Mayıs 2011 Çarşamba
dt.ToString("d");  04.05.2011
dt.ToString("yyyy.MM.dd"); 2011.05.04

Yukarıda uygulanan formatların tamamı String.Format() yönteminde de aynen kullanılabilir.
String.Format("{0:m}", dt); 04 Mayıs

dt.ToLongDateString(); 04 Mayıs 2011 Çarşamba
dt.ToShortTimeString(); 23:19
dt.ToShortDateString(); 04.05.2011
dt.ToString(); 04.05.2011 23:17:08

Başta da dediğim gibi geniş bir konu. İhtiyaça göre bu anlatılan özellikler birçok faklı şekilde kullanılabilir.
Başlangıç için umarım faydalı olmuştur.