Вот один из способов сделать это.Он будет поддерживать разумную глубину (892 байта), но не бесконечную.Кроме того, это будет довольно медленно для большого набора данных, но не уверен, что вы можете избежать проблем с производительностью здесь с имеющейся структурой данных.
declare @article table(ArticleCode varchar(10))
insert @article values
('1')
, ('1.1')
, ('1.2')
, ('1.3')
, ('2')
, ('3')
, ('3.1')
, ('3.2')
, ('3.3')
, ('3.4')
, ('3.5')
, ('4')
, ('4.1')
, ('4.1.1')
, ('4.1.2')
, ('4.1.3')
, ('4.2')
, ('4.2.1')
, ('4.2.10')
, ('4.2.11')
, ('4.2.12')
, ('4.2.2')
, ('4.2.3')
, ('4.2.4')
, ('4.2.5')
, ('4.2.6')
, ('4.2.7')
, ('4.2.8')
, ('4.2.9')
select *
from @article
order by convert(hierarchyid, '/' + replace(ArticleCode, '.', '/') + '/') --have to append the / before and after so the values are a valid hierarchyid