Wygląda na to, że masz już rozwiązanie, które spełniło Twoje potrzeby, ale mam małą sztuczkę, której używam, aby wyodrębnić liczby z ciągów, które moim zdaniem mogą komuś przynieść korzyści. Wykorzystuje instrukcję FOR XML i unika jawnych pętli. Stanowi dobrą funkcję tabeli inline lub prosty skalar. Zrób z tym, co chcesz :)
DECLARE @String varchar(255) = 'This1 Is2 my3 Test4 For Number5 [email protected]';
SELECT
CAST((
SELECT CASE --// skips alpha. make sure comparison is done on upper case
WHEN ( ASCII(UPPER(SUBSTRING(@String, Number, 1))) BETWEEN 48 AND 57 )
THEN SUBSTRING(@String, Number, 1)
ELSE ''END
FROM
(
SELECT TOP 255 --// east way to get a list of numbers
--// change value as needed.
ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) AS Number
FROM master.sys.all_columns a
CROSS JOIN master.sys.all_columns b
) AS n
WHERE Number <= LEN(@String)
--// use xml path to pivot the results to a row
FOR XML PATH('') ) AS varchar(255)) AS Result
Wynik ==> 1234510