I'm not sure if this helps.
I sure had fun replicating the SOUNDEX function which I then changed it into the DIFFERENCE function, all by keeping it as an inline table-valued function to help performance.
CREATE FUNCTION iFullDifference(
@String1 varchar(30),
@String2 varchar(30)
) RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
WITH
E(n) AS(
SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
SELECT a.n FROM E a UNION ALL SELECT a.n FROM E a
),
cteTally(n) AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
FROM E2
),
cteNumbers AS(
SELECT n,
NULLIF(
CASE WHEN SUBSTRING( @String1, n, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String1, n, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String1, n, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String1, n, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String1, n, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String1, n, 1) LIKE '[r]' THEN 6
END,
CASE WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[hw]'
THEN
CASE WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String1, n - 2, 1) LIKE '[r]' THEN 6
END
ELSE
CASE WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String1, n - 1, 1) LIKE '[r]' THEN 6
END
END) num
FROM cteTally
WHERE SUBSTRING( @String1, n, 1) NOT LIKE '[aeiouyhw]'
AND n <= LEN(@String1)
),
cteNumbers2 AS(
SELECT n,
NULLIF(
CASE WHEN SUBSTRING( @String2, n, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String2, n, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String2, n, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String2, n, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String2, n, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String2, n, 1) LIKE '[r]' THEN 6
END,
CASE WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[hw]'
THEN
CASE WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String2, n - 2, 1) LIKE '[r]' THEN 6
END
ELSE
CASE WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[bfpv]' THEN 1
WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[cgjkqsxz]' THEN 2
WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[dt]' THEN 3
WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[l]' THEN 4
WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[mn]' THEN 5
WHEN SUBSTRING( @String2, n - 1, 1) LIKE '[r]' THEN 6
END
END) num
FROM cteTally
WHERE SUBSTRING( @String2, n, 1) NOT LIKE '[aeiouyhw]'
AND n <= LEN(@String2)
)
SELECT SUM( CASE WHEN ISNULL( a.num, 0) = ISNULL( b.num, 0) THEN 1 ELSE 0 END) Difference
FROM cteTally t
LEFT
JOIN (
SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY n) n, num
FROM cteNumbers
WHERE num IS NOT NULL) a ON t.n = a.n
LEFT
JOIN (
SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY n) n, num
FROM cteNumbers2
WHERE num IS NOT NULL) b ON t.n = b.n
WHERE t.n <= 4
GO
SELECT *, DIFFERENCE(String1, String2)
FROM (VALUES( 'Kolton', 'Colton')) x(String1, String2) --This is sample data.
CROSS APPLY iFullDifference(String1, String2)
GO
DROP FUNCTION iFullDifference