If you do not like a function, or if you do not have the rights to create a new function, you can use the quite fast XML approach. In your case it needs some extra effort to get this XML-safe (due to special characters and the ;
as delimiter):
Declare @Dummy table (ID int, SomeTextToSplit varchar(max))
Insert Into @Dummy values
(1,'A&B;C;D;E, F')
,(2,'"C" & "D";;D;E, F');
DECLARE @Delimiter VARCHAR(10)=';';
WITH Casted AS
(
SELECT *
,CAST('' + REPLACE((SELECT REPLACE(SomeTextToSplit,@Delimiter,'§§Split$me$here§§') AS [*] FOR XML PATH('')),'§§Split$me$here§§','') + '' AS XML) AS SplitMe
FROM @Dummy
)
SELECT Casted.*
,x.value('.','nvarchar(max)') AS Part
FROM Casted
CROSS APPLY SplitMe.nodes('/x') AS A(x)
The result
1 A&B
1 C
1 D
1 E, F
2 "C" & "D"
2
2 D
2 E, F