MSSQL Split bzw. explode function

Ich hatte die letzten Monate über das Vergnügen mein etwas eingestaubtes SQL Wissen wieder auffrischen zu dürfen. Als Folge dessen sind ein paar SQL snippets entstanden die u. U. auch jemandem anderen im Netz helfen könnten.

Als erstes möchte ich eine Funktion mit euch Teilen welche es ermöglicht einen übergebenen String anhand eines Trennzeichens zu zerlegen. Die Funktion ist sehr hilfreich wenn man Daten aus einer Datenbank ziehen muß bei der die Entwickler der Meinung waren, dass es Klug ist bestimmte Informationen einfach nur z. B. durch pipes getrennt in ein varchar Feld zu schreiben…

-- Die Funktion zerlegt einen String anhand eines Trennzeichens und gibt einen definierbaren Teilstring zurück.
-- @param String der zu zerlegenden String
-- @param Delimiter das Trennzeichen anhand dessen der String zerlegt wird
-- @param returnItem die Nummer des Objektes welches zurück gegeben werden soll
-- @return returnslice der Rückgabewert - wenn nichts gefunden wird ist dieser "Null"
-- ChangeLog:
-- 20090505: Erste Version erstellt von Johannes Schmidt (Security-Blog.eu)
if exists (select * from information_schema.routines where routine_name = N'split' and routine_type = 'function') drop function [dbo].[split]
GO
CREATE FUNCTION dbo.split(@String varchar(8000), @Delimiter varchar(12), @returnItem int)
returns varchar(8000)
AS
BEGIN
declare @id int
declare @idx int
declare @slice varchar(8000)
declare @returnslice varchar(8000)
set @id = 0
set @idx = 1
set @returnslice = null
while @idx!= 0
begin
set @id = @id + '1'
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if @id = @returnItem set @returnslice = @slice
set @String = SUBSTRING(right(@String,len(@String) - @idx),len(@Delimiter) + 1, len(@String))
if len(@String) = 0 break
end
return @returnslice
end

Anwendungsbeispiel:

Select split('Ich bin ein Test', ' ', 2)

Der Rückgabewert wäre hier “bin”.

Verwandte Themen:

  1. MSSQL String in RTF wandeln
  2. MSSQL stored procedures, views und functions erstellen

Tags: ,

5 Responses to “MSSQL Split bzw. explode function”

  1. Robert Pöhler Says:

    Wobei ein Entwickler der eine Trennung mit Pipes macht an sich ja schon einen Klatsch auf den Kopf verdient ;)

  2. johannes Says:

    Absolut richtig – das hindert leider viele nicht daran es zu tun :(

  3. Herbert Says:

    oder es gibt Fälle, da geht es nicht anders!

    Das Script hat noch Fehler!

    Beispiel:

    Select split(’90 24 50 50′,’ ‘,2)
    = 24 (Richtig)

    Select split(’90.24.50.50′,’.',2)
    = 4 (falscher Wert!)

  4. Stephan Says:

    set @String = SUBSTRING(right(@String,len(@String) – @idx),len(@Delimiter), len(@String))

    dann funktioniert’s

  5. Jens Says:

    Super, genau wonach ich gesucht habe! Vielen, vielen Dank!!!

Leave a Reply