Лично я бы сделал это с помощью встроенной табличной функции
В SQL Server 2017 или более поздней версии или в базе данных SQL Azure:
CREATE OR ALTER FUNCTION dbo.ExtractUpperCase(@s nvarchar(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH s(s) AS (SELECT 1 UNION ALL SELECT s+1 FROM s WHERE s < LEN(@s))
SELECT TOP (3) value = STRING_AGG(SUBSTRING(@s,s,1),'')
WITHIN GROUP (ORDER BY s.s)
FROM s WHERE ASCII(SUBSTRING(@s,s,1)) BETWEEN 65 AND 90
);
GO
В SQL Server 2016 или более ранней версии:
CREATE FUNCTION dbo.ExtractUpperCase(@s nvarchar(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH s(s) AS (SELECT 1 UNION ALL SELECT s+1 FROM s WHERE s < LEN(@s))
SELECT value = (SELECT TOP (3) v = SUBSTRING(@s,s,1) FROM s
WHERE ASCII(SUBSTRING(@s,s,1)) BETWEEN 65 AND 90
ORDER BY s.s FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(4000)')
);
GO
В любом случае:
CREATE TABLE #x(id int, name nvarchar(4000));
INSERT #x(id, name) VALUES
(1, N'Belo Horizonte Orange'),
(2, N'São Paulo Lala'),
(3, N'Ferraz de Vasconcelos Toranto');
SELECT id, f.value FROM #x AS x
CROSS APPLY dbo.ExtractUpperCase(x.name) AS f
ORDER BY id OPTION (MAXRECURSION 4000);
Результаты:
id name
---- ----
1 BHO
2 SPL
3 SVT
OPTION (MAXRECURSION 4000)
необходим только в том случае, если длина ваших строк может превышать 100 символов.