Non sono sicuro del motivo per cui pensi di non poterlo fare con un UNPIVOT e un PIVOT :
select [1], [2], [3], [4], [5]
from
(
select *
from
(
select col1, col2, col3,
row_number() over(order by col1) rn
from yourtable
) x
unpivot
(
val for col in (col1, col2, col3)
) u
) x1
pivot
(
max(val)
for rn in ([1], [2], [3], [4], [5])
) p
Vedi SQL Fiddle con demo . Questo potrebbe anche essere eseguito dinamicamente, se necessario.
Modifica, se l'ordine delle colonne deve essere mantenuto, puoi usare qualcosa di simile, che applica il row_number() senza utilizzare un order by su una delle colonne della tabella (ecco un articolo sull'utilizzo numeri di riga non deterministici
):
select [1], [2], [3], [4], [5]
from
(
select *
from
(
select col1, col2, col3,
row_number()
over(order by (select 1)) rn
from yourtable
) x
unpivot
(
val for col in (col1, col2, col3)
) u
) x1
pivot
(
max(val)
for rn in ([1], [2], [3], [4], [5])
) p;
Vedi SQL Fiddle con demo