Using SQLSERVER STUFF() and PATINDEX() will solve this question
FOR MASKING THE NAME
declare @str varchar(20)
declare @rcInt int
set @str ='Rio De janerio'
set @rcInt = 4;
with cte as
(select left(@str, len(@str)-@rcInt) as name
),
rn as
(select stuff(name, patindex('%[a-z]%',name), 1, 'X') as ch, patindex('%[a-z]%',name)as rn, name from cte
union all
select stuff(ch, rn+patindex('%[a-z]%',substring(name, rn+1, len(name))), 1, 'X') as ch, rn+patindex('%[a-z]%',substring(name, rn+1, len(name)))as rn, name from rn
where patindex('%[a-z]%',substring(name, rn+1, len(name)))>0
)
select top 1 ch + right(@str, @rcInt) from rn order by rn desc
FOR TELEPHONE NUMBER (as function)
create function ufn_MaskPhoneNum(
@str varchar(20),
@rcInt int
)
returns @tblReturn table(maskedStr varchar(100))
as
begin
with cte as
(select left(@str, len(@str)-@rcInt) as name
),
rn as
(select stuff(name, patindex('%[0-9]%',name), 1, 'X') as ch, patindex('%[0-9]%',name)as rn, name from cte
union all
select stuff(ch, rn+patindex('%[0-9]%',substring(name, rn+1, len(name))), 1, 'X') as ch,
rn+patindex('%[0-9]%',substring(name, rn+1, len(name)))as rn, name from rn
where patindex('%[0-9]%',substring(name, rn+1, len(name)))>0
)
insert into @tblReturn
select top 1 ch + right(@str, @rcInt) from rn order by rn desc
return;
end
sample:
select * from ufn_MaskPhoneNum('123 453 6987', 4)