There are several ways to do this. If you are looking for a purely declarative approach, you could use a recursive CTE. The following example of this is presented as a generic solution with test data which should be adaptable to your needs:
Declare @Delimiter As Varchar(2)
Set @Delimiter = ','
Declare @Strings As Table
(
String Varchar(50)
)
Insert Into @Strings
Values
('12,345,6,78,9'),
(Null),
(''),
('123')
;With String_Columns As
(
Select
String,
Case
When String Is Null Then ''
When CharIndex(@Delimiter,String,0) = 0 Then ''
When Len(String) = 0 Then ''
Else Left(String,CharIndex(@Delimiter,String,0)-1)
End As String_Column,
Case
When String Is Null Then ''
When CharIndex(@Delimiter,String,0) = 0 Then ''
When Len(String) = 0 Then ''
When Len(Left(String,CharIndex(@Delimiter,String,0)-1)) = 0 Then ''
Else Right(String,Len(String)-Len(Left(String,CharIndex(@Delimiter,String,0)-1))-1)
End As Remainder,
1 As String_Column_Number
From
@Strings
Union All
Select
String,
Case
When CharIndex(@Delimiter,Remainder,0) = 0 Then Remainder
Else Left(Remainder,CharIndex(@Delimiter,Remainder,0)-1)
End As Remainder,
Case
When CharIndex(@Delimiter,Remainder,0) = 0 Then ''
When Len(Left(Remainder,CharIndex(@Delimiter,Remainder,0)-1)) = 0 Then ''
Else Right(Remainder,Len(Remainder)-Len(Left(Remainder,CharIndex(@Delimiter,Remainder,0)-1))-1)
End As Remainder,
String_Column_Number + 1
From
String_Columns
Where
(Remainder Is Not Null And Len(Remainder) > 1)
)
Select
String,
String_Column,
String_Column_Number
From
String_Columns