• 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