This code is faster than using loops
sql Code:
-- ============================================= -- Author: <Michael Ciurescu> -- Create date: <20091104> -- Description: <Split string into table, separator can be more than 1 char> -- ============================================= CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @DataList NVARCHAR(MAX) , @Separator NVARCHAR(MAX) ) RETURNS @tbl TABLE ( RowIndex INT PRIMARY KEY , FromPos INT , ToPos INT , ItemData NVARCHAR(MAX) ) AS BEGIN -- SELECT * FROM dbo.fn_SplitStringToTable('123,43,5465,6788,1231,111', ',') DECLARE @LenSep INT SET @LenSep = DATALENGTH(@Separator) / 2 IF @LenSep > 0 AND DATALENGTH(@DataList) > 0 BEGIN ; WITH res (RowIndex, FromPos, ToPos) AS ( SELECT CAST(1 AS INT) AS RowIndex , CAST(1 AS INT) AS FromPos , CAST(CHARINDEX(@Separator, @DataList + @Separator) AS INT) AS ToPos UNION ALL SELECT CAST(RowIndex + 1 AS INT) AS RowIndex , CAST(res.ToPos + @LenSep AS INT) AS FromPos , CAST(CHARINDEX(@Separator, @DataList + @Separator, ToPos + @LenSep) AS INT) AS ToPos FROM res WHERE CHARINDEX(@Separator, @DataList + @Separator, ToPos + @LenSep) > 0 ) INSERT INTO @tbl SELECT res.*, SUBSTRING(@DataList, FromPos, ToPos - FromPos) AS ItemData FROM res OPTION (MAXRECURSION 0) END RETURN END




Reply With Quote
