ОК, из того, что я собираю из комментариев.
Вот два варианта. Подход XML и ParseName (). ParseName () завершится ошибкой, если у вас есть точки в тексте и / или более 4 элементов
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)
Оба вернутся
Pos1 Pos2 Pos3
Today Test 12456
EDIT
Я вижу, что вы обновили вопрос.
Если вы ДЕЙСТВИТЕЛЬНО хотели перейти на динамический SQL, это может быть так просто, как
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)