Pazartesi , 20 Kasım 2017

Isnull fonksiyonunda Bug mı var?

ISNULL fonksiyonu verilen bir değerin NULL olup olmadığını kontrol edip eğer NULL ise verilen değer yerine belirtilen alternatif değeri döndüren bir fonksiyondur. Gelen kullanımı aşağıdaki gibidir.

ISNULL ( check_expression , replacement_value )

Fonksiyonun aldığı ilk parametre olan check_expression NULL olup olmadığı kontrol edilecek ifadedir. İkinci parametre olan replacement_value  ise eğer ilk değer Null ise onun yerine döndürülecek değeri belirtmektedir. Örneğin AdventureWorks veritabanındaki Production.Product tablosunda Color değerini kontrol edip eğer NULL ise bu değer yerine Renksiz yazalım.

SELECT TOP 100 ProductID,Name,ProductNumber,ISNULL(Color,'Renksiz') Color

FROM Production.Product

Isnull1.jpg

Çok sık kullanılan ISNULL fonksiyonunu diğer fonksiyonlar gibi bir geri dönüş tipine sahiptir. Bu geri dönüş tipi ISNULL fonksiyonunun aldığı ilk parametre ile aynıdır. Bu yüzden özellikle karakter tabanlı işlemlerde parametrelerin boyutlarına dikkat edilmelidir. Şimdi aşağıdaki örneği inceleyelim.

declare @birinciDegisken varchar(10)=NULL

declare @ikinciDegisken varchar(100)

 

set @ikinciDegisken='10 karakterden daha uzun bir metin'

 

select ISNULL(@birinciDegisken,@ikinciDegisken)

Isnull2.jpg

Örneğimizin çıktısına baktığımızda beklenenin aksine sadece belirtmiş olduğumuz değerin bir kısmını yani ilk on karakterini yazmıştır. Bunun sebebi ise ilk değişkenimizin uzunluğunun on karakter olması ve ISNULL fonksiyonun geri dönüş tipinin ilk değişken uzunluğu ile sınırlandırılmış olmasıdır. ISNULL fonksiyonu için bu sınırlamam herhangi bir bug ya da hata değildir. Çünkü aksi durumda SQL Server beklemediği bir durumla karşılaşabilir. Örneğin yukarıdaki örneğimizin çıktısını bir tabloya INSERT etmek istediğimizi ve tablonun o kolonundaki uzunluğunu varchar(10) olduğu durumlarda bu kullanım aşağıdaki hataya neden olacaktır.

Msg 8152, Level 16, State 14, Line 2

String or binary data would be truncated.

The statement has been terminated.
Bu durumun sorun yaratmayacağı yerlerde ikinci değerin tamamımın görüntülenmesi iki farklı yöntem kullanılabilir. Birinci ilk değişkeni daha büyük boyutlu bir değişkene çevirmektir.

 

declare @birinciDegisken varchar(10)=NULL

declare @ikinciDegisken varchar(100)

 

set @ikinciDegisken='10 karakterden daha uzun bir metin'

 

select ISNULL(CAST(@birinciDegisken AS VARCHAR(100)),@ikinciDegisken)

 

İkinci yöntem ise ISNULL fonksiyonu yerine COALESCE fonksiyonunu kullanmaktır.

 

declare @birinciDegisken varchar(10)=NULL

declare @ikinciDegisken varchar(100)

set @ikinciDegisken='10 karakterden daha uzun bir metin'

select COALESCE(@birinciDegisken,@ikinciDegisken)

Isnull3

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>