In one of my projects I had to split a string which held a list of names delimited by the forwardslash '/' character into a proper table structure, so that the values could be used in a relational format.
I tried a few things including putting a bunch of PATINDEX type commands together, until I found a solution which works (it may not be particularly scalable). This also trims whitespace from either side of the delimiter in case they aren't evenly spaced:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fnSplitDelimitedString]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) DROP FUNCTION [dbo].[fnSplitDelimitedString] GO CREATE FUNCTION fnSplitDelimitedString (@list nvarchar(MAX),@delimiter VARCHAR(1)) RETURNS @tbl TABLE (name varchar(255) NOT NULL) AS BEGIN DECLARE @pos int, @nextpos int, @valuelen int SELECT @pos = 0, @nextpos = 1 WHILE @nextpos > 0 BEGIN SELECT @nextpos = charindex(@delimiter , @list, @pos + 1) SELECT @valuelen = CASE WHEN @nextpos > 0 THEN @nextpos ELSE len(@list) + 1 END - @pos - 1 INSERT @tbl (name) VALUES (convert(varchar(255), ltrim(rtrim(substring(@list, @pos + 1, @valuelen))))) SELECT @pos = @nextpos END RETURN END SELECT name FROM fnSplitDelimitedString('Gerry Smith / Tom Martin / Michael Green/Rohil Sen/Dominic Davidson/Richard Wilson','/') as Split
You can pass in your own delimiter (comma, semicolon etc), and the function returns a table in this format which is a whole lot more useful:
Name Gerry Smith Tom Martin Michael Green Rohil Sen Dominic Davidson Richard Wilson
I found this solution on a blog post by Erland Sommarskog which has a lot more potential solutions. If the solution I posted doesn't work for you and you need something which will scale up, try reading his detailed write-up.
This solution was tried and tested on SQL Server 2005.
0 comments:
Post a Comment