CREATE FUNCTION [dbo].[SplitWithPairs] ( @List NVARCHAR(MAX), @MajorDelimiter VARCHAR(3) = ',', @MinorDelimiter VARCHAR(3) = ':' ) RETURNS @Items TABLE ( Position INT IDENTITY(1,1) NOT NULL, LeftItem INT NOT NULL, RightItem INT NOT NULL ) AS BEGIN DECLARE @Item NVARCHAR(MAX), @LeftItem NVARCHAR(MAX), @RightItem NVARCHAR(MAX), @Pos INT; SELECT @List = @List + ' ', @MajorDelimiter = LTRIM(RTRIM(@MajorDelimiter)), @MinorDelimiter = LTRIM(RTRIM(@MinorDelimiter)); WHILE LEN(@List) > 0 BEGIN SET @Pos = CHARINDEX(@MajorDelimiter, @List); IF @Pos = 0 SET @Pos = LEN(@List) + LEN(@MajorDelimiter); SELECT @Item = LTRIM(RTRIM(LEFT(@List, @Pos - 1))), @LeftItem = LTRIM(RTRIM(LEFT(@Item, CHARINDEX(@MinorDelimiter, @Item) - 1))), @RightItem = LTRIM(RTRIM(SUBSTRING(@Item, CHARINDEX(@MinorDelimiter, @Item) + LEN(@MinorDelimiter), LEN(@Item)))); INSERT @Items(LeftItem, RightItem) SELECT @LeftItem, @RightItem; SET @List = SUBSTRING(@List, @Pos + LEN(@MajorDelimiter), DATALENGTH(@List)); END RETURN; END GO DECLARE @ValuePairs VARCHAR(MAX) = '1:1, 1:2, 1:4, 2:3,1000:230, 130:120,'; SELECT LeftItem, RightItem FROM dbo.SplitWithPairs(@ValuePairs, ',', ':') ORDER BY Position; GO
source share