First you can create a function converting a string to table. For instance you can use this one:
CREATE FUNCTION dbo.StringToTable
(
@Input NVARCHAR (4000),
@Delimiter NVARCHAR(1)
)
RETURNS @OutputTable TABLE (val NVARCHAR(50))
AS
BEGIN
DECLARE @val NVARCHAR(50);
WHILE LEN(@Input) > 0
BEGIN
SET @val = LEFT(@Input, ISNULL(NULLIF(CHARINDEX(@Delimiter, @Input) - 1, -1), LEN(@Input)));
SET @Input = SUBSTRING(@Input, ISNULL(NULLIF(CHARINDEX(@Delimiter, @Input), 0), LEN(@Input)) + 1, LEN(@Input));
INSERT INTO @OutputTable (val) VALUES (@val);
END
RETURN
END
GO
Let's write a query which uses this function and generate the result you want to see:
DECLARE @P1 AS NVARCHAR(100) = N'xxx~yyy',
@P2 AS NVARCHAR(100) = N'10~12~15',
@P3 AS NVARCHAR(100) = N'1~2~7';
SELECT
ROW_NUMBER() OVER( ORDER BY t1.val, t2.val, t3.val) AS rn, *
FROM dbo.StringToTable(@P1, N'~') AS t1
CROSS JOIN dbo.StringToTable(@P2, N'~') AS t2
CROSS JOIN dbo.StringToTable(@P3, N'~') AS t3
___________________________
Do Not Optimize for Exceptions!