CREATE FUNCTION [dbo].[fn_SplitStringToTable]
(
@p_Input VARCHAR(MAX),
@p_Delimeter CHAR(1) = ','
)
RETURNS @l_Table TABLE
(
Id INT IDENTITY(1, 1),
Value VARCHAR(511),
Position INT,
Length INT
)
BEGIN
DECLARE @l_Position INT,
@l_Value VARCHAR(256)
SELECT @l_Position = 1,
@l_Value = ''
IF RIGHT(@p_Input, LEN(@p_Delimeter)) <> @p_Delimeter
SET @p_Input = @p_Input + @p_Delimeter
WHILE SUBSTRING(@p_Input, @l_Position, 1) = CHAR(10) OR
SUBSTRING(@p_Input, @l_Position, 1) = CHAR(13)
BEGIN
SELECT @l_Position = @l_Position + 1
END
WHILE @l_Position <= CHARINDEX(@p_Delimeter, @p_Input, @l_Position)
BEGIN
SET @l_Value = RTRIM ( LTRIM ( SUBSTRING ( @p_Input,
@l_Position,
CHARINDEX ( @p_Delimeter,
@p_Input,
@l_Position) - @l_Position ) ) )
IF NOT EXISTS ( SELECT 1
FROM @l_Table
WHERE Value = @l_Value )
BEGIN
INSERT INTO @l_Table ( Value, Position, Length )
VALUES ( @l_Value, @l_Position, CHARINDEX ( @p_Delimeter,
@p_Input,
@l_Position ) - @l_Position )
END
SELECT @l_Position = CHARINDEX(@p_Delimeter, @p_Input, @l_Position) + 1
WHILE SUBSTRING(@p_Input, @l_Position, 1) = CHAR(10) OR
SUBSTRING(@p_Input, @l_Position, 1) = CHAR(13)
BEGIN
SELECT @l_Position = @l_Position + 1
END
END
RETURN
END