The 'no reverse' is an interesting requirement. Here's my attempt at it
with stringList as (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) ID, String,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(String,' ',''),'.',''),',',''),'''',''),'-','') Compact --More replaces are likely
FROM (VALUES ('bob'),('Madam, I''m Adam'),('noon'),('fail'),('a')) AS I(String)
),
cteTally as (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) N
FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(N),
(VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(N)
)
SELECT ID, String, CASE WHEN SUM(c) = LEN(Compact)/2 THEN 'Palidrome' ELSE 'Not Palidrome' END C
FROM (
SELECT ID, String, Compact, CASE WHEN SUBSTRING(Compact,N,1) = SUBSTRING(Compact,LEN(Compact) - N + 1, 1) THEN 1 ELSE 0 END c
FROM stringLists
OUTER APPLY (SELECT TOP(LEN(Compact)/2) N FROM cteTally) t
) a
GROUP BY ID, String, Compact;