Во-первых, я хочу прояснить это: я полностью согласен с комментариями к вопросу от a_horse_with_no_name и Jeroen Mostert.
Вы должны хранить одну точку данных на столбец, точка.
ИмеяТем не менее, я понимаю, что во многих случаях структура базы данных не может быть изменена - так что вот один из возможных способов получить этот расчет для вас.
Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах):
DECLARE @T AS TABLE
(
col varchar(100)
);
INSERT INTO @T (col) VALUES
('A0004'),
('1B2005'),
('1B2000'),
('1B00'),
('20CCCCCCC21');
(я добавил пару строк в качестве крайних случаев, которые вы не упомянули в вопросе)
Тогдаиспользуя пару cross apply
для минимизации повторения кода, я придумал, что:
SELECT col,
LEFT(col, LEN(col) - LastCharIndex + 1) +
REPLICATE('0', LEN(NumberString) - LEN(CAST(NumberString as int))) +
CAST((CAST(NumberString as int) + 1) as varchar(100)) As Result
FROM @T
CROSS APPLY
(
SELECT PATINDEX('%[^0-9]%', Reverse(col)) As LastCharIndex
) As Idx
CROSS APPLY
(
SELECT RIGHT(col, LastCharIndex - 1) As NumberString
) As NS
Результаты:
col Result
A0004 A0005
1B2005 1B2006
1B2000 1B2001
1B00 1B01
20CCCCCCC21 20CCCCCCC22
LastCharIndex
представляет индекс последнего не-значный символ в строке. NumberString
представляет число для приращения в виде строки (чтобы сохранить начальные нули, если они существуют).
Оттуда просто берется левая часть строки (то есть до числа) и объединить его с новой вычисляемой числовой строкой, используя Replicate
для дополнения результата сложения точным числом начальных нулей, которое имела исходная числовая строка.