SQL Split functie
Een van de dingen die ik vandaag moest maken in MS-SQL was een Split-functie. Eerst was ik van plan deze in C# te maken en dan via een dll in SQL Server 2005 te laden. Dit heeft echter als nadeel dat je weer code binaries in SQL gaat gebruiken en dit lastig kan blijken om bij klanten door te voeren. Uiteraard is het wel vette functionalteit, maar als het niet hoeft, doe ik het liever niet.
Gelukkig hebben meer mensen het probleem ondervonden dat er geen Split-functie zit in T-SQL, dus hadden andere mensen deze al gemaakt.
Aangezien ik niet werkzaam ben bij Wieluitvinders B.V. heb ik maar besloten andermans code hiervoor te gebruiken. Vadivel M had al een mooi voorbeeld op z’n weblog staan, wat hier is te vinden: https://vadivel.blogspot.com/2006/05/split-function-in-sql-server-method-1.html
Deze heb ik dus ordinair gekopieerd. Even later zag ik dat hij dit ook heeft gedaan, omdat nagenoeg dezelfde code op nog tig andere pagina’s was te vinden. Bij deze deel ik dus hier ook nogmaals de Split-functie.
Create function Split (@String nvarchar(4000), @Delimiter char(1))
Returns @Results Table (Items nvarchar(4000))
As Begin Declare @Index int Declare @Slice nvarchar(4000)
Select @Index = 1
If @String Is NULL Return
While @Index != 0
Begin Select @Index = CharIndex(@Delimiter, @String)
If Index != 0
Select @Slice = left(@String, @Index - 1)
else
Select @Slice = @String
Insert into @Results(Items) Values (@Slice)
Select @String = right(@String, Len(@String) - @Index)
If Len(@String) = 0 break
End
Return
End
Het voorbeeld dat hij gebruikt
Select 1, 'Vadivel', * From Split ('xxxxx~yyyyyyy~zzzzzz','~')
is natuurlijk leuk, maar niet echt iets dat je in de praktijk zult gebruiken. Zelf heb ik dit maar vertaald in het volgende:
SELECT ItemID, Tekst, (SELECT Items FROM Split(Tabel.Functie, '|') WHERE Items = 78) AS SplitFunctie FROM Tabel
Zoals ik de functie nu gebruik moet je onthouden dat je absoluut maar 1 item mag terug geven uit de Split functie. Als ik de WHERE Items = 78
niet zou hebben toegevoegd, dan crasht de query.
Er zijn hier vast wel chique oplossingen voor te bedenken, maar daar had ik momenteel niet echt veel tijd voor. Ook nog goed om te weten is dat de database compatibility level op 90 moet staan (SQL 2005). Dit kan gewoon via de GUI worden gedaan. Om dit te doen via een query moet je maar even via Google zoeken.
Dit staat wel in de top 10. Wanneer je dit niet doet, dan kun je niet de Tabel.Functie
gebruiken in de sub-query die in de SELECT
staat en krijg je alsnog een foutmelding te zien.