ISNULL vs COALESCE

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Som SQL server konsult så ser jag ofta flitig användning av ISNULL() i T-SQL, där utvecklare vill ersätta ett  eventuellt NULL värde med ett annat värde från en annan kolumn eller dylikt. Tanken med ISNULL() i sig är inte fel, men implementationen av den kan orsaka problem. Varför då? Jo, resultatet av ISNULL har samma datatyp och storlek som den första parametern i funktionen. Prova nedanstående kod i SQL  server management studio. DECLARE @a varchar(10); DECLARE @b varchar(20); SET @b=‘01234567890123456789’ SELECT ISNULL(@a, @b), COALESCE(@a,@b)

I resultatet så är den första kolumnen trunkerat till 10 tecken, men i den andra får du 20 tecken. ISNULL funktionen förutsätter då att resultatet ska ha samma datatyp som variabeln @a, men COALESCE tittar på samtliga parametrar och väljer den datatyp som i det här fallet är störst. Ytterligare en fördel med COALESCE är att du kan skicka in multipla parametrar och den väljer den första parametern som inte är NULL. Eftersom COALESCE är lite mer avancerad så är ISNULL marginellt snabbare, men det hastighetsskillnaden är generellt försumbar såvida inte det är miljontalsrader som returneras, fast då är det en liten overhead i sammanhanget.

Läs gärna Adam Machanics blogg där han jämför prestandan mellan de båda : http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx Slutsatsen är enligt min mening (och Adams): undvik ISNULL till förmån för COALESCE.

/Håkan Winther