• 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!