I need to transform some strings from this format:
"1020202020"
To
"1-0-2-0-2-0-2-0-2-0"
How can I do that in a simple way?
Thanks
Every day I wake up and think to myself "What impossible thing will CTEs make possible today?"
;with cte as (
    select 
        '1020202020' inputstring,
        convert(varchar(max),'') outputstring
    union all
    select
        substring(inputstring,2,len(inputstring)),
        outputstring + left(inputstring,1) + '-' + case when len(inputstring) = 2 then right(inputstring,1) else '' end
    from cte
    where len(inputstring) > 1
)
select top 1 outputstring from cte order by len(outputstring) desc
 
    
    Your question is unclear on the exact rules are for the placement of the hyphens.
So, there might be some clever method using replace().
For your example string:
select replace(replace(col, '02', '-0-2'), '20', '2-0')
 
    
    I would proceed like this :
TRIM(TRAILING "-" FROM REPLACE("10203040", "0", "-0-"))
 
    
    Here's a non-loop/non-recursive solution. I had some fun with REPLACE() and it's VERY efficient. It can process 100,000 rows in less than a second which is probably better than any looping or recursive solution.
IF OBJECT_ID('strings') IS NOT NULL
    DROP TABLE strings;
CREATE TABLE strings (string BIGINT);
--Populate the table
WHILE(SELECT COUNT(*) FROM strings) < 100000
BEGIN
    INSERT INTO strings
        SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
        SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
        SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
        SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL
        SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000
END
--Add the hyphens with REPLACE() and cut off the extra hyphen at the end with SUBSTRING()
SELECT SUBSTRING(
                REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(string, '0', '0-'),'1','1-'),'2','2-'),'3','3-'),'4','4-'),'5','5-'),'6','6-'),'7','7-'),'8','8-'),'9','9-'),
                0,
                LEN(string)*2
                ) AS String
FROM strings;
Abbreviated Results:
String
------------------------
5-6-1-2-9-4-9-0-8-1
7-5-8-5-1-9-3-0-9
2-2-4-7-6-1-5-7-6-9
9-3-4-6-1-0-3-5-0
9-9-5-3-6-8-8-7-8-9
5-3-7-2-0-5-3-0-6
8-4-0-8-9-8-9-4-5-0
9-8-6-4-6-8-4-4-3-9
6-6-5-8-2-8-7-3-9-2
...
