Tente algo como isto:
WITH AreaCode (A) AS (
SELECT '[0-9][0-9][0-9][-.]'
UNION ALL SELECT '([0-9][0-9][0-9])-'
), Prefix (P) AS (
SELECT '[0-9][0-9][0-9]-'
), Last4 (L) AS (
SELECT '[0-9][0-9][0-9][0-9]'
), Ext1 (E1) AS (
SELECT ' x'
UNION ALL SELECT ' Ext.'
UNION ALL SELECT ' ext'
), Ext2 (E2) AS (
UNION ALL SELECT '[0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9]'
UNION ALL SELECT '[0-9][0-9][0-9][0-9]'
), Extension (E) AS (
SELECT ''
UNION ALL SELECT E1 + E2 FROM Ext1 CROSS JOIN Ext2
),
SELECT *
FROM
YourTable Y
WHERE NOT EXISTS (
SELECT *
FROM
AreaCode
CROSS JOIN Prefix
CROSS JOIN Last4
CROSS JOIN Extension
WHERE
Y.PhoneNumber LIKE AreaCode + Prefix + Last4 + Extension
);
Se você encontrar padrões válidos, mas não cobertos pela consulta, adicione-os às partes e peças mostradas. Se você encontrar algo que precisa estar junto nas duas partes, modele-o após o Extension CTE (que está ausente ou uma combinação de Ext1 e Ext2). Se você precisar oferecer suporte a números internacionais, e eles tiverem padrões diferentes (que não correspondam aos EUA 3-3-4), será necessária alguma análise e correlação adequada para fazer com que os códigos de país certos correspondam aos padrões certos. Por exemplo, eu sei que em certas partes do Brasil, este é um número válido: +55 85 1234-5678 (código do país 55, código de área dois dígitos e padrão 4-4).
Outra técnica para ajudá-lo a analisar seus dados é:
WITH Patterns (P) AS (
SELECT
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(
PhoneNumber,
'1', '0'), '2', '0'), '3', '0'), '4', '0'),
'5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'
)
)
SELECT P, Count(*)
FROM Patterns
GROUP BY P;
Isso pode ajudá-lo a entender como são os seus dados, ignorando as diferenças reais de número de telefone entre cada linha e prestando atenção apenas à organização e contagem de dígitos. Se houver muitos caracteres alfa, tente começar a substituir padrões válidos (como "ext") por um valor não encontrado na lista, para recolher o restante da entrada espúria em algo que possa ser analisado com um valor semelhante. Replace()
para cada letra do alfabeto.