You will need a Tally table to do the following, but it beats the cursor and grows dynamically with the next OS released, your table of tables should also be zero.
EDIT:
1 ( Tally):
, sys.all_columns. , .
;WITH Tally(N)
AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
FROM sys.all_columns C)
SELECT OS + CASE WHEN N > 0 THEN ' SP' + CAST(B.N AS char(1))
ELSE ''
END
FROM dbo.Test A
INNER JOIN Tally B ON B.N >= A.MinSp
AND B.N <= A.MaxSp
( Tally, ):
SELECT OS + CASE WHEN N > 0 THEN ' SP' + CAST(B.N AS char(1))
ELSE ''
END
FROM dbo.Test A
INNER JOIN dbo.Tally B ON B.N >= A.MinSp
AND B.N <= A.MaxSp