Вам нужна табличная функция разбиения, похожая на следующую:
CREATE FUNCTION [dbo].[udf_Split] (@DelimitedList nvarchar(max), @Delimiter nvarchar(2) = ',')
RETURNS @SplitResults TABLE (Position int NOT NULL PRIMARY KEY, Value nvarchar(max))
AS
Begin
Declare @DelimiterLength int
Set @DelimiterLength = DataLength(@Delimiter) / 2
If Left(@DelimitedList, @DelimiterLength) <> @Delimiter
Set @DelimitedList = @Delimiter + @DelimitedList
If Right(@DelimitedList, @DelimiterLength) <> @Delimiter
Set @DelimitedList = @DelimitedList + @Delimiter
Insert @SplitResults(Position, Value)
Select CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength
, Substring (
A.List
, CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength
, CharIndex(@Delimiter, A.list, N.Value + 1)
- ( CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength )
)
From dbo.Numbers As N
Cross Join (Select @DelimitedList As list) As A
Where N.Value > 0
And N.Value < LEN(A.list)
And Substring(A.list, N.Value, @DelimiterLength) = @Delimiter
Order By N.Value
Return
End
Эта функция основана на существовании таблицы Numbers
, которая содержит последовательный список целых чисел.Теперь вы можете взять исходные данные и сделать что-то вроде:
With TableData As
(
Select 1 As Id, '\\Root' As [Path]
Union Select All 2, '\\Root\Node0'
Union Select All 3, '\\Root\Node0\Node1'
Union Select All 4, '\\Root\Node0\Node2'
Union Select All 5, '\\Root\Node3'
Union Select All 6, '\\Root\Node3\Node4'
Union Select All 7, '\\Root\Node5'
)
, SplitData As
(
Select T.Id, T.[Path], S.Value
, Row_Number() Over ( Partition By T.Id Order By S.Position ) As Level
From TableData As T
Cross Apply dbo.udf_Split( (Substring(T.[Path],2,Len(T.[Path])) + '\') , '\') As S
)
Select Id, [Path]
, Min( Case When Level = 1 Then S.Value End ) As Level0
, Min( Case When Level = 2 Then S.Value End ) As Level1
, Min( Case When Level = 3 Then S.Value End ) As Level2
, Min( Case When Level = 4 Then S.Value End ) As Level3
, Min( Case When Level = 5 Then S.Value End ) As Level4
From SplitData As S
Group By Id, [Path]