Here is the code I used:
CREATE FUNCTION dbo.TallyN (
@EndNumber bigint
)
RETURNS TABLE
AS RETURN
(-- Inline Tally table producing a number sequence from 1 to @SAMPLE_SIZE
WITH T(N) AS (SELECT N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) AS X(N))
SELECT TOP(@EndNumber) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N
FROM T T1,T T2,T T3,T T4,T T5,T T6,T T7,T T8,T T9
)
GO
SELECT n.N ID, STUFF(
(SELECT ',' + CONVERT(VARCHAR(20), n3.RandomN)
FROM
--picking a random quantity of random numbers per ID
(SELECT TOP 1 N topn FROM dbo.TallyN(30) WHERE n.N > 0 ORDER BY NEWID() ) n2
-- now picking the random numbers themselves, [topn] of different numbers per each ID
CROSS APPLY (SELECT TOP (topn) N RandomN FROM dbo.TallyN(1000) WHERE n.N > 0 ORDER BY NEWID()) n3
FOR XML PATH('')
), 1,1,'')
--generating ID's - may be coming from a table with actual set of ID's, does not have to be generated
FROM dbo.TallyN(10000) n
ORDER BY id
Execution time - 7 seconds.
_____________
Code for TallyGenerator