T-SQL Programlama Elemanları – Bölüm 50

Kodların oluşturulmasından çalışmasına kadar, kod içerisindeki ifadelerin sunucuyla etkileşime girme şeklini iyi anlamak gereklidir. Kod içerisinde kullanılan değerleri geçici olarak saklamak da önemlidir. Ayrıca nesnelerin farklı bir isimle veya nesneleri uzak bir konumdan kullanabilmek için takma ad veya pointer oluşturmak gerekebilmektedir. Bu bölümde bu konuların her birine değineceğiz.


T-SQL Batch İşlemleri

T-SQL batch, bir client tarafından SQL Server’a tek bir öge şeklinde gönderilen bir ya da daha fazla T-SQL ifadesinden oluşan ifade yığınıdır. SQL Server’da kod ayrıştırılırken, optimize edilirken ve yürütülürken ifadeler toplu olarak aynı anda çalıştırılmaktadır.

Rapor yazarken önceliğiniz SELECT ifadeleri kullanmaksa batch’in sınırlarını iyi anlamanız gerekir, çünkü bunların sp ve diğer rutin işlemlerdeki değişken ve parametrelerle çalışırken muhtemeldir etkisi olacaktır. Batch içerisinde kullanılan bir değişkeni aynı batch içerisinde tanımlamak zorunludur. Bu nedenle batch içerisinde nelerin olduğunu bilmek önemlidir.

Batch’lere client programı tarafından limit koyulmuştur; batch’in bittiği yerin belirlenmesi için kullanılan işaret client ayarlarına bağlıdır. Örneğin, SSMS) varsayılan batch terminatörü GO anahtar sözcüğüdür. SSMS tarafından kullanılan bir anahtar sözcüktür, T-SQL dilinde böyle anahtar sözcük yoktur.

T-SQL batch’leri ile çalışırken akılda tutulması gereken iki önemli husus bulunmaktadır:

  • Batch, değişkenlerin çalışma sınırı olarak belirtilir. Yani bir batch’te tanımlanan bir değişken sadece aynı batch içerisinde kullanılabilir.
  • CREATE VIEW gibi bazı tanımlama ifadeleri genelde aynı batch içerisindeki diğer benzer tanımlarla birlikte kullanılmazlar.


Batch’ler ile Çalışma

Batch’lerin nasıl ayrıştırıldığını anlamanız, çalışma şeklini ve hata mesajlarını anlamanızda yardımcı olacaktır.

Batch gönderildiğinde (SSMS’de Run düğmesine bastığınızda olduğu gibi), bu batch SQL Server motoru tarafından syntax hatalarını bulmak için ayrıştırılır. Hata bulunursa batch çalıştırılmaz. Hata durumunda batch’in bir kısmının çalıştırılması diye de bir şey olmayacaktır.

Gönderilen batch, syntax denetiminden sorunsuz geçtikten sonra SQL Server batch’deki nesneleri çözümlemeye başlar, izinleri denetler ve kodu çalıştırmadan önce optimizasyonu sağlar. İşlem tamamlandığında ve batch çalışmaya başladığında, her bir ifade çalıştırılır ve teker teker başarılı veya başarısız şeklinde sonuçlanır. Aslında bu, syntax kontrolündeki önemli bir çelişkidir. Bir satırda runtime hatası oluşursa ve exception handling kodu yazılmadıysa bir sonraki satır yürütülmeye devam edebilir. Hata işlemeyi sonraki bölümlerde anlatacağız.

Örneğin aşağıdaki batch ilk satırda bir syntax hatası içermektedir. VALUES deyimi hatalı olarak VALUE şeklinde yazılmıştır:

INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO 

Batch gönderildiğinde aşağıdaki hata dönecektir:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'. 

İlk satırda hata oluştuğundan batch çalıştırılmadı. Satırların yeri değiştirilirse de ikinci satırda yine syntax hatası oluşacak ve ilk satır çalıştırılmayacaktır çünkü tüm batch’in çalıştırılması engellenmiş olacaktır.


T-SQL Değişkenleri

T-SQL’de diğer programlama dillerinde olduğu gibi değişkenler bir değeri daha sonra kullanmak için geçici olarak depolanmasına izin veren nesnelerdir. Değişkenler kullanılmadan önce değerleri atanır.

T-SQL’de, değişkenleri kullanmadan önce tanımlası da yapılmalıdır. Değişkenlere bir isim atanır ve veri türü de belirtilir. Değişkenlere tanımlandıkları anda bir değer de atanabilir.

Bildiğiniz üzere, değişkenler kullanılacağı batch içerisinde oluşturulmalıdır. Diğer bir deyişle, tüm T-SQL değişkenlerinin ömrü bulunduğu batch’in ömrü kadardır. Tanımlanan değişken sadece aynı batch’teki diğer ifadeler tarafından kullanılabilir. Batch sona erdiğinde değişken de otomatik olarak yok edilir.

Aşağıda sp’ye geçirilecek değerlerin aynı batch içerisinde değişkenlerde tutulması gösterilmiştir:

--Değişkenlerin tanımlanıp değer atanması
DECLARE @numrows INT = 3, @catid INT = 2;
--Değişkenlerin sp'ye input olarak verilmesi
EXEC Production.ProdsByCategory
 @numrows = @numrows, @catid = @catid;
GO


Değişken Kullanmak

Bir değişkeni tanımladıktan sonra değer atamasını yapmak gerekir. Bu işlem üç şekilde yapılabilir:

  • SQL Server 2008 veya sonraki sürümlerde DECLARE ifadesiyle değişken tanımlanıp aynı anda değer atanabilir.
  • SQL Server’ın herhangi bir sürümünde SET ifadesiyle değişkene skaler değer atanabilir.
  • SQL Server’ın herhangi bir sürümünde, SELECT ifadesini kullanarak değişkene değer atanabilir. Bu yöntemde, SELECT ifadesinin sadece tek bir satır döndürüyor olması gerekmektedir. Boş sonuç dönerse, değişken orijinal değerinde bırakılır; birden fazla sonuç dönerse de hata basacaktır.

Aşağıdaki örnekte değişkenlere değer atamanın üç yolu da gösterilmiştir:

DECLARE @var1 AS INT = 99;
DECLARE @var2 AS NVARCHAR(255);
SET @var2 = N'string';
DECLARE @var3 AS NVARCHAR(20);
SELECT @var3 = lastname FROM HR.Employees WHERE empid=1;
SELECT @var1 AS var1, @var2 AS var2, @var3 AS var3;
GO

Sonuç:

var1 var2 var3
---- ------ ----
99 string Davis 


Synonym’lerle Çalışmak

SQL Server’da synonim, aynı veri tabanındaki nesneyle hatta SQL Server’ın başka bir instance’ında bulunan bir nesneyle bağlantı kurmak veya takma ad oluşturmak için kullanılır. Synonim tanımlanabilen nesneler arasında tablo, view, sp ve kullanıcı tanımlı fonksiyonlar bulunmaktadır.

Synonim’ler, uzak nesnenin yerel görünmesini sağlamak için veya yerel bir nesneye takma ad vermek için kullanılabilir. Bu durumda bir nesneye erişirken gerçek adına bakılmaksızın takma adı kullanılır.

Not: Henüz oluşturulmayan bir nesneye verilen bir synonim de oluşturulabilir. Buna gecikmeli ad çözümlemesi denmektedir. SQL Server motoru, kod çalışırken synonym’i bulunana dek nesnenin varlığını denetlemez.

Synonim’ler için DDL komutlarından CREATE SYNONYM, ALTER SYNONYM ve DROP SYNONYM ifadelerini kullanabilirsiniz:

CREATE SYNONYM dbo.ProdsByCategory FOR TSQL.Production.ProdsByCategory;
GO
EXEC dbo.ProdsByCategory @numrows = 3, @catid = 2; 

Synonim tanımlarken için CREATE SYNONYM kullanmaya ve synonim’lerin kaydedildiği şemada değişiklik yapma izinlerine sahip olmanız gerekmektedir.

Kaynak:
Using Synonyms (Database Engine)
Variables (Transact-SQL)
Batches

Leave a Reply

Your email address will not be published. Required fields are marked *