Kategori arşivi: SQL

SQL SERVER

Bir SQL Server üzerine başka sql server tanıtma & sp_addlinkedserver

Değerli okuyucularım, bazen birden fazla sql sunucusunu olduğu bir ortamda çalışırken iki farklı sql sunucusu üzerinden ortak sorgular yapma ihtiyacı doğabilir. Bu benim bazen başıma  geliyor ve bunun için mevcut sql serverlardan birine diğer sql sunucuyu bağlayarak işimi çözüyorum. Burada eğer iki sunucu arasında versiyon farkı varsa üst sürüme alt sürümü bağlamak doğru olur. Bu işlem kullanılan sql server sürümüne göre birkaç değişik şekilde yapılabilir.
İsterseniz SQL Server management studio üzerinde Server Objects altında Linked Servers üzerine sağ tıklayarak New Linked Server seçeneğinden başka bir sql server sunucusunu bağlayabilirsiniz.
Ancak ben bunu benim gibi kod ile yapmak isteyenler için aşağıdaki örnek genellikle işe yarar

Burada Sp_Addlinkedserver ve Sp_Addlinkedsrvlogin prosedürleri kullanılarak  mevcut bir sql sunucu üzerine yeni bir sql sunucu bağlantısı ekleniyor.

exec sp_addlinkedserver @server='NewSqlServer', @srvproduct='SQL Server'
exec sp_addlinkedsrvlogin @rmtsrvname='NewSqlServer', @locallogin=NULL, @useself='False', @rmtuser='sa', @rmtpassword='123'

 

Bu komutlar başarılı şekilde çalıştıktan sonra sorgularınızda misafir sunucu için DB isimlerinden önce ilgili sql server ın adını yazmanız yeterli. Eğer sorun çıkarsa bir de sunucu ismine ip yazarak deneyin.

Örnek;
Select MusteriKodu from MYDB.dbo.MUSTERILER A
LEFT JOIN  NevSqlServer.MYDB.dbo.MUSTERILER B
ON A.MusteriKodu=B.MusteriKodu

Böylece tek sunucu üzerinde iki farklı sunucunun database leri üzerinden ortak sorgulama yapmış olduk.

SQL SERVER da CURSOR KULLANMAK

SQL üzerindeki cursor işlemlerinin genel amacı satır satır işlem yapabilmektir.
Bil hassa satırlar üzerinden belli sıra ile geçerek önceki yada sonraki satırlarla ilişkili yada tamamen başka tablodaki kayıt satırları ile ilişkili işlemlerin ve fonksiyonların çalıştırılabilmesidir.
Hemen bir örnek verecek olursak aşağıda genel hatlarıyla bir cursor uygulaması bulabilirsiniz.
Cursor

 

Sorgu yapılan tablo
Cursor2

Komut özeti;

DECLARE XXX CUSROS
FOR  (Select statement)
OPEN XXX
FETCH NEXT FROM XXX INTO (variants)
WHILE @@FETCH_STATUS<>0
BEGIN
-- Process
END
CLOSE XXX
DEALLOCATE XXX

Tablo üzerinde kayıt silme

Tablolar üzerinde zaman zaman kayıt silme işlemleri gerçekleştirmemiz gerekebilir.
Bu durumda Delete komutu sıklıkla kullanılır. Kayıtlar select komutundaki gibi seçilir.

Select * from dbo.Musteri where MusteriTipi='Perakende'
Yukarıdaki gibi Musteri tablosunda tipi perakende olan kayıtları seçebildiğimiz gibi bu kayıtları Delete komutuyla silebiliriz.

DELETE from dbo.Musteri where MusteriTipi='Perakende'
Burada herhangi bir alan belirtilmez çünkü satır olarak silinmektedir.

Bu komutun dikkatli kullanılması gerekir çünkü özel bir durum olmadıkça kayıtlar kalıcı olarak silinir.
Kayıt silme işlemi kayıt sayısına göre zaman alabilmektedir.
Eğer çok kayıt olan bir tablodaki tüm kayıtları silerek tabloyu tamamen boşaltmak isteniyorsanız delete komutu yerine truncate table komutunu tavsiye ederim.
örneğin 1 milyon kayıt olan bir müşteri tablosunu
DELETE FROM MUSTERI yerine
TRUNCATE TABLE MUSTERI komutu ile çok daha hızlı silebilirsiniz. Ancak bu komut koşul almadan tüm tabloyu silmektedir.

Ayrıca bazı durumlarda kayıtları silmeden sadece belli kolonların topluca temizlenmesine ihtiyaç duyulabilir.
Bu tip durumlarda da Update komutundan yararlanabilirsiniz.
Update MUSTERI SET BekleyenSiparis=0 where BolgeKodu='34'
Yani Musteri tablosundaki bölge kodu 34 olan kayıtların bekleyen siparişlerini sıfırla anlamındadır.

SQL Insert Komutu

Sql server üzerinde bir kayıt satırı oluşturmak için INSERT INTO komutu kullanılmaktadır.

örnek;
Aşağıdaki tabloya insert komutu ile kayıt nasıl kayıt atıldığı görülmektedir.

sqlinsert

sqlinsert2

Burada dikkat edilirse ID alanı için bir değer belirtmedik. Çünkü ID alanı otomatik artan kimlik alanı olarak tanımlanmıştır.
Ayıca tüm alanlar sırası ile verildiği taktirde alan isimlerini yazmadan da insert işlemi gerçekleştirilebilir. Ancak ileride herhangi bir sorun yaşamam adına alan isimlerinin belirtilerek insert komutu çalıştırmak doğru bir alışkanlık olur.

Alan isimleri verilmeden kayıt satırı oluşturma;
INSERT INTO [dbo].[Aday] VALUES (‘123456789′,’KEMAL’ ,’KARA’ ,’ADANA’ ,’2001-02-25 11:32:00′ ,’36945′,’69’ ,’1.66′ ,’02358469752′)

Insert into komutu kullanılırken dikkat edilmesi gereken bir diğer konu ise eğer boş geçilemez bir alan varsa bunların atlanılmaması gerekir, default olarak dahi bir değer belirtilmelidir. Bir de alan uzunlukları dikkate alınmalıdır. Mesela alan özelliği varchar(20) olan yani 20 alfasayısal karaktere izin verilen bir alana 21 veya daha fazla karakter içeren bir değer set edilemeyeceği için hata alırız. Bu hatalar insert komutunu yeni kullanmaya başlayan arkadaşların sıklıkla karşılarına çıkabileceği hatalar olduğundan burada hatırlatmak istedim.

Temel SQL komutları

Sql serverda query oluştururken kullanılabilecek onlarca farklı özellikte ifade bulunmaktadır.Ancak bunlardan bir kısmı sorgularda sıklıkla karşılaşılan ve temel veri sorgulama işleminde kullanılan komutlar dır.  Özellikle sql ile yeni çalışaların ilk ögrenmesini gereken komutlardandır.

Bunlardan bazıları;

SELECT : Tablodan alınması istenen kolon başlıkları seçmeyi ifade eder.

FROM : Hangi tablodan yada tablolardan veri alınacağını ifade eder.

WHERE : Hangi koşula uyan kayıtların çağrılmasını ifade eder.

ORDER BY : Tablodan çağrılacak kayıtların hangi sıralama ile gelmesi gerektiğini belirler.

Not: birden çok alan seçilirken aralarına virgül konularak ayrılır.

Örnek;

ID Adi Soyadi Telefon Bolge
1 KENAN CANDAN 35461312 06
2 FATMA ÇINAR 43453453 35
3 AHMET HARUN 24169846 34
4 FATİH DEMİR 23423422 55
5 OSMAN DİLSİZ 49442349 34
6 CANAN POLAT 23232342 34

SELECT Adi,Soyadi FROM Telefonlar WHERE ID<6 and Adi<>’KENAN’ ORDER BY Adi

Anlamı: Telefonlar tablosundaki adi , soyadi alanlarını çek ancak ID si 5 den küçük ve ismi Kenan olmayanları alıp ad a göre sırala.

Sonuç:

Adi Soyadi Telefon
AHMET HARUN 24169846
FATİH DEMİR 23423422
FATMA ÇINAR 43453453
KENAN CANDAN 35461312