OK, from what I gather from the comments.
Here are two options. The XML approach and ParseName(). ParseName() will fail if you have periods within the text and/or more than 4 items
declare @st1 varchar(50) = 'Today+Test+12456'
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
From (Select Cast('<x>' + replace((Select replace(@st1,'+','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
Select Pos1 = parsename(tStr,3)
,Pos2 = parsename(tStr,2)
,Pos3 = parsename(tStr,1)
From ( values(replace(@st1,'+','.'))) B1(tStr)
Both would return
Pos1 Pos2 Pos3
Today Test 12456
EDIT
I see that you've updated the question.
If you REALLY wanted to go Dynamic SQL, it could be as simple as
CREATE TABLE #TempTable (
Id INT IDENTITY,
col1 varchar(50),
col2 varchar(50),
col3 nvarchar(50)
);
Declare @st1 varchar(50) = 'Today+Test+12456'
Declare @SQL varchar(max) = 'Insert Into #TempTable values ('''+replace(@st1,'+',''',''')+''')'
Exec(@SQL)