Вы можете использовать XML-трюк, чтобы разделить их.
Пример фрагмента:
declare @Table table (X varchar(30));
insert into @Table (X) values
('AAAfstdatasmthg'),
('BBBfirstdatalongerXXelse'),
('ZZZ4567890123456789012345');
SELECT
X2.value('/x[1]','varchar(30)') as firstinfo,
X2.value('/x[2]','varchar(30)') as secondinfo
FROM @Table
CROSS APPLY (
SELECT
CAST('<x>'+STUFF(X,
case LEFT(X,3)
when 'AAA' then 11
when 'BBB' then 21
else LEN(X)-4
end
,0,'</x><x>')+'</x>' AS XML) AS X2
) as ca;
Или используйте ЗНАЧЕНИЯ
Пример фрагмента:
declare @Table table (X varchar(30));
insert into @Table (X) values
('AAAfstdatasmthg'),
('BBBfirstdatalongerXXelse'),
('ZZZ4567890123456789012345');
SELECT
LEFT(X, COALESCE(pos, LEN(X)-5)) as firstinfo,
SUBSTRING(X, COALESCE(pos, LEN(X)-4), IIF(pos is not null, LEN(X)-pos+1, 5)) as secondinfo
FROM @Table t
LEFT JOIN (VALUES
('AAA',11),
('BBB',21)
) v(code, pos) ON v.code = LEFT(X,3);
Результат:
firstinfo secondinfo
------------- ----------
AAAfstdata smthg
BBBfirstdatalongerXX else
ZZZ45678901234567890 12345
Но для этого примера, я думаю, можно также сосредоточиться на длине secondinfo:
SELECT
LEFT(X, case LEFT(X,3) when 'BBB' then LEN(X)-4 else LEN(X)-5 end) as firstinfo,
SUBSTRING(X, case LEFT(X,3) when 'BBB' then LEN(X)-3 else LEN(X)-4 end, 5) as secondinfo
FROM @Table;