SQL UDF - String Splitter
a. This function is used to split a given string and return the positional value
Example: 'ABC;DEF;GHI' is delimtied by ; and we need the positional values.
CREATE FUNCTION [dbo].[func_string_splitter_v2] (@DelimitedString [VARCHAR](8000),@Delimiter [VARCHAR](100),@pos [INT]) RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE
@DelSize INT = LEN(@Delimiter),
@TokenCount INT,
@SearchPos INT,
@Index INT,
@Start INT,
@CurrentPos INT = 0,
@Value VARCHAR(1000);
-- how many pieces?
SET @TokenCount =
(LEN(@DelimitedString)
- LEN(REPLACE(@DelimitedString, @Delimiter, '')))
/ @DelSize
+ 1;
-- allow negative indexing
IF @pos < 0
SET @SearchPos = @TokenCount + 1 + @pos;
ELSE
SET @SearchPos = @pos;
-- if out of bounds, bail out
IF @SearchPos < 1 OR @SearchPos > @TokenCount
RETURN NULL;
-- walk the string until we hit the desired piece
WHILE LEN(@DelimitedString) > 0
AND @CurrentPos < @SearchPos
BEGIN
SET @Index = CHARINDEX(@Delimiter, @DelimitedString);
IF @Index = 0
BEGIN
-- last piece
SET @Value = LTRIM(RTRIM(@DelimitedString));
SET @CurrentPos = @CurrentPos + 1;
BREAK;
END
ELSE
BEGIN
-- take everything up to the delimiter
SET @Value = LTRIM(RTRIM(SUBSTRING(@DelimitedString,1,@Index-1)));
SET @Start = @Index + @DelSize;
SET @DelimitedString =
SUBSTRING(@DelimitedString,@Start,
LEN(@DelimitedString)-@Start+1);
SET @CurrentPos = @CurrentPos + 1;
END
END
RETURN @Value;
END
GO
Usage:
select [dbo].[func_string_splitter_v2]('abc;def;ghi',';',1)
abc
select [dbo].[func_string_splitter_v2]('abc;def;ghi',';',2)
def
select [dbo].[func_string_splitter_v2]('abc;def;ghi',';',0)
NULL
select [dbo].[func_string_splitter_v2]('abc;def;ghi',';',-1)
ghi