3 Şubat 2013 Pazar

SQL de Hata Fırlatmak(Raise Error in SQL)

  • Bazı durumlarda SQL serverın hata fırlatmasını beklemeden kendimiz sorgunun hata fırlatıp bitmesini isteriz.
  • Örneğin yazdığımız sp yada trigger hata vermeden bizim kendi kontrollerimiz ile hata fırlatmasını sağlayabiliriz.
  • İstediğimiz durum SQL Hatası olmayıp bizim koyduğumuz kontrol neticesinde bir mantık hatası olabilir.
ÖRNEK:

CREATE PROC sp_ciftsayininkaresi
@sayi INT
AS
BEGIN
IF(@sayi%2!=0)
    BEGIN
    RAISERROR ('Girilen sayı çift sayı değildir.',10,1)
    END
ELSE
    PRINT @sayi*@sayi
END

NOT: Basit bir sp yazıyoruz. İstediğimiz sp ye gelen değerin hep çift sayı olması aksi halde işlem yapmamamız.






SP yi çalıştırdığımız zaman;

EXEC sp_ciftsayininkaresi 3



20 Ocak 2013 Pazar

SQL Server da Temp(Geçici) ve Değişken(Variable) Tabloların Kullanılması

  • SQL Serverda Geçici tablo oluştururken iki seçeneğimiz bulunmakta. Bunlar kullanım şeklinize göre farklılık gösterebilir.
  • Birinci kullanım şeklimiz geçici tabloları (Temporary tables).
  • İkinci kullanım şeklimiz değişken tablolar (Table variables). 
  • Bu iki yönteminden birbirlerine karşı avantaj ve dezavantajları bulunmaktadır.
1-) Geçici Tablolar (Temporary Tables)
  • Temp Tabloların normal tablolardan başlıca farklı system database lerden olan tempdb içinde tutuluyor olmalarıdır.
  • Oluşturduğumuz tablonun temp table olduğunu SQL Servera bildirmek için başına '#' işareti koyarız.
  • SQL Serverda geçici tablolara sadece bulundukları ortamlardan erişilebilir. Eğer temp table a global olarak diğer ortamlardan da erişilmesini istiyorsak o zaman global temp table kullanmamız gerekmektedir.
  • Global temporary tables (Genel geçici tablolar) tanımlamak için temp table dan farklı olarak CREATE TABLE dediktenden sonra tablomuzun ismini vermeden önce '##' (2 adet) koyarız.
  • Global temporary tables ın bütün özellikleri temp table ile aynıdır.
  • Ayrıca oluşturduğumuz tabloyu kullanıdıktan sonra silmeyi unutmayalım. Unutsak dahi oturum kapandığında SQL Server otomatik bütün temp table ları silecektir. 
SÖZ DİZİMİ:

CREATE TABLE #TemporaryTable(
     number INT PRIMARY KEY,
     name NVARCHAR(50),
     surname NVARCHAR(50)
)





--Direk sorgu sonucu gelen listeyi temp tabloya eklemek için;

SELECT * INTO #TemporaryTable FROM Person


--Tablomuzu silmek için;
DROP TABLE #TemporaryTable  

NOT: SQL Serverda '#' ile başlayan tablolar SQL Server durduğu ana kadar saklanır. Fakat tablolarımızı tempdb.. altına kendimiz normal tablo ekler gibi eklersek tablolarımız SQL Server kapatılana kadar orda saklanır. SQL Server kapatıldığında temp tablolarımızın silinmesini istiyorsak bu yapıyı kullanabiliriz.


  1-) Değişken Tablolar (Table Variables)

  •  Değişken tablolarda aslında geçici tablolara benzemektedir. Fakat fark olarak oluşturduğumuz tablonun bir kısmı tempdb de bir kısmında Sunucu olarak kullanıdığımız SQL Server belleğinde tutulmaktadır.
  • Değişken tablolarda da geçici tablo gibi bir yapı vardır. Değişken tablo oluşturduğumuz zaman tablo isminin başına '@' işareti koyarız.
  • Değişken tablolara erişim geçici tablolara göre daha hızlı olmaktadır. Fakat değişken tablolara fazla veri yüklemek belleği dolduracağından performans kaybına da yol açabilir.
  • Değişken tablolar, kullanıcı tanımlı fonksiyonlar (User Defined Functions) içinde kullanılabilirken, geçici tabloların UDF içinde kullanımı mümkün değildir. 
  • Stored Procedure ler içinde 2 tablo yapımızıda kullanabiliriz.
  • Değişken tablolar üzerinde index tanımı yapamayız fakat geçici tablolar üzerinde yapabiliriz.
  • Değişken tablolar tanımlandıktan sonra (declare) alter table ile değiştiremeyiz.
 SÖZ DİZİMİ:

DECLARE @TemporaryTable TABLE (
     number INT PRIMARY KEY,
     name NVARCHAR(50),
     surname NVARCHAR(50)
)

29 Aralık 2012 Cumartesi

SQL Server'da Fonksiyon Oluşturma ve Kullanma

  • Fonksiyonlar istenilen veri tiplerini alıp istenilen veri tiplerini veya bir tablo bile geri döndürebilir.
  • Birden çok parametre vereceğimiz zaman bunları virgül ile ayırmamız gerekmektedir. 
Function Create(Fonksiyon  Oluşturma) 
  • Örneğimizde Animals tablomuzdaki Kusların ortalama ağırlıklarını döndüren bir fonksiyon yazalım.

ÖRNEK:

CREATE FUNCTION fnc_OrtalamaAgirlik
(
@KusNo int
)
RETURNS int
AS
BEGIN
  DECLARE @Result int
  SET @Result = (SELECT AVG(Weight) FROM Animals.dbo.Kuslar WHERE KusNo <=@KusNo)
RETURN(@Result)
END


Function Kullanma(Fonksiyon  Kullanma)  
  • İstediğimiz lokasyondan doğru path i vererek fonksiyonumuzu çağırabiliriz.
 ÖRNEK:

DECLARE @KusNo int
SET @KusNo = 5
SELECT dbo.fnc_OrtalamaAgirlik(@KusNo) AS Ortalama



58. SELECT INTO Deyiminin Kullanılması

  • SELECT INTO ile ilgili veritabanı üzerindeki verilerle kopya veritabanı oluşturabiliriz.
  • Kullanım durumlarına değinirsek  örneğin tablomuza değişiklik yapmadan önce yedekleyebiliriz.
  • Ayrıca bütün bir veritabanını kopyalamak yerine istediğimiz verileri içeren yeni bir kopya oluşuturup onu yedekleyebiliriz.

SÖZ DİZİMİ;

SELECT kolon_ad(ları) INTO [yeni_veritabanı.]yeni_tablo_adı
FROM ilgili_veritabanı

ÖRNEK:

SELECT * INTO Animals.dbo.Kuslar_Yedek FROM Animals.dbo.Kuslar
 

23 Aralık 2012 Pazar

SQL Serverda Karakter Sorunları

  • SQL Serverda Unicode Karakter Nasıl Kullanabiliriz?
-SQL Server elle girdiğimiz string değeri ASCII olarak algılar.

-Bu string Unicode String olarak algılaması için string ifadesini başına 'N' koymamız gerekmektedir.
  • Bozuk Karakterilerin Karşılığını Nasıl Bulabiliriz?  
 -Tabi ki belli başlı harfleri kontrol ederek onlara bizdeki karşılıklarını atayarak bozuk karakterlerin karşılığını bulabiliriz.

DECLARE @gelen NVARCHAR(MAX)
DECLARE @sonuc NVARCHAR(MAX)
SET @gelen = N'þýrýnga'

SET @sonuc = Replace(@gelen COLLATE Latin1_General_BIN,N'ð', N'ğ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'ð', N'Ğ'); 
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN, N'Ð', N'Ğ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'ý', N'ı');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'Ý', N'İ');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'þ', N'ş');  
SET @sonuc = Replace(@sonuc COLLATE Latin1_General_BIN,N'Þ', N'Ş');
SELECT  @sonuc  COLLATE Turkish_CI_AS ;





Yukardaki örneğimizdeki gibi bir fonsiyon ile gerekli dönüşümü yapabilirsiniz.