I knww this is a very old post but just wanted to add this in case anyone was interested. Two simple solutions for SQL 2017 and above and pre SQL 2017
/* SQL 2017 and above */
declare @str varchar(50) = 'dff dfdff !"£$%^&*()_-+=@~#?/>.< dfd dfd'
;WITH nums AS
(
SELECT 1 AS Num
UNION ALL
SELECT num + 1 AS Num
FROM nums
WHERE Num + 1 <= LEN(@str)
)
SELECT STRING_AGG(Val,'')
FROM (
SELECT *,SUBSTRING(@str,Num,1) AS val
FROM nums) a
WHERE val LIKE '%[A-Z]%'
/*Pre SQL 2017 */
declare @str varchar(50) = 'dff dfdff !"£$%^&*()_-+=@~#?/>.< dfd dfd'
;WITH nums AS
(
SELECT 1 AS Num
UNION ALL
SELECT num + 1 AS Num
FROM nums
WHERE Num + 1 <= LEN(@str)
)
SELECT STUFF((SELECT '' + Val AS [text()]
FROM (
SELECT *,SUBSTRING(@str,Num,1) AS val
FROM nums) a
WHERE val LIKE '%[A-Z]%'
FOR XML PATH ('')),1,0,'')