You could use a Number or Tally table. Here is one way to do it with an inline-tally table:DECLARE @T TABLE (col1 varchar(3), col2 varchar(10), col3 varchar(10))INSERT @T VALUES('aaa', 'rack1', '1-3'),('bbb', 'rack2', '22-23'), ('ccc', 'rack3', '19-20');WITH Tens (N) AS (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9), Thousands(N) AS (SELECT t1.N FROM Tens t1 CROSS JOIN Tens t2 CROSS JOIN Tens t3), Millions (N) AS (SELECT t1.N FROM Thousands t1 CROSS JOIN Thousands t2), Tally (N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) FROM Millions)SELECT A.*, T.N As PositionFROM @T AS A INNER JOIN Tally AS T ON T.N BETWEEN CAST(PARSENAME(REPLACE(col3, '-', '.'), 2) AS INT) AND CAST(PARSENAME(REPLACE(col3, '-', '.'), 1) AS INT)