This way gets rid of the the UNION statement and avoids a loop altogether:
DECLARE @position INT
SET @position = 5
DECLARE @n TABLE (n int)
INSERT INTO @n
SELECT ROW_NUMBER() OVER (ORDER BY name) AS x
FROM syscolumns
SELECT t.*
FROM dbo.Table t
CROSS JOIN @n n
WHERE n <= @position