Если вы используете SQL Server 2005 или более позднюю версию и число возможных полей в номерах версий фиксировано, вы можете попробовать следующий подход:
SELECT t.*
FROM @tblVersion t
CROSS APPLY (SELECT v = NULLIF(CHARINDEX('.', '.' + t.VersionNumber, 1), 0)) v1
CROSS APPLY (SELECT v = NULLIF(CHARINDEX('.', '.' + t.VersionNumber, v1.v + 1), 0)) v2
CROSS APPLY (SELECT v = NULLIF(CHARINDEX('.', '.' + t.VersionNumber, v2.v + 1), 0)) v3
CROSS APPLY (SELECT v = NULLIF(CHARINDEX('.', '.' + t.VersionNumber, v3.v + 1), 0)) v4
CROSS APPLY (SELECT v = NULLIF(CHARINDEX('.', '.' + t.VersionNumber, v4.v + 1), 0)) v5
ORDER BY
CAST(SUBSTRING(t.VersionNumber, v1.v, v2.v - v1.v - 1) AS int),
CAST(SUBSTRING(t.VersionNumber, v2.v, v3.v - v2.v - 1) AS int),
CAST(SUBSTRING(t.VersionNumber, v3.v, v4.v - v3.v - 1) AS int),
CAST(SUBSTRING(t.VersionNumber, v4.v, v5.v - v4.v - 1) AS int),
CAST(SUBSTRING(t.VersionNumber, v5.v, 999) AS int)
Все поля номера версии извлекаются одно за другим и преобразуются в целые числа, которые затем используются для сортировки. (По сути, идея @ Brian , как выясняется.)