• 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;