web-dev-qa-db-fra.com

Requête SQL Server 2008 pour rechercher des lignes contenant des caractères non alphanumériques dans une colonne

On m'a posé cette question il y a quelques semaines, alors que je sais exactement comment le faire avec un SP ou UDF mais je me demandais s'il y avait un moyen rapide et facile de le faire sans ces Je suppose qu'il y en a et je ne le trouve pas.

Un point que je dois faire est que, bien que nous sachions quels caractères sont autorisés (az, AZ, 0-9), nous ne voulons pas spécifier ce qui n'est pas autorisé (# @! $ etc ...). De plus, nous voulons extraire les lignes qui ont les caractères illégaux afin qu'elles puissent être listées par l'utilisateur à corriger (comme nous n'avons aucun contrôle sur le processus d'entrée, nous ne pouvons rien faire à ce stade) ).

J'ai parcouru SO et Google auparavant, mais je n'ai rien trouvé qui a fait ce que je voulais. J'ai vu de nombreux exemples qui peuvent vous dire s'il contient des caractères alphanumériques, ou pas, mais quelque chose qui est capable de sortir une apostrophe dans une phrase que je n'ai pas trouvée sous forme de requête.

Notez également que les valeurs peuvent être null ou '' (vide) dans cette colonne varchar.

33
Jay

Cela ne le fera-t-il pas?

SELECT * FROM TABLE
WHERE COLUMN_NAME LIKE '%[^a-zA-Z0-9]%'

Configuration

use tempdb
create table mytable ( mycol varchar(40) NULL)

insert into mytable VALUES ('abcd')
insert into mytable VALUES ('ABCD')
insert into mytable VALUES ('1234')
insert into mytable VALUES ('efg%^&hji')
insert into mytable VALUES (NULL)
insert into mytable VALUES ('')
insert into mytable VALUES ('apostrophe '' in a sentence') 

SELECT * FROM mytable
WHERE mycol LIKE '%[^a-zA-Z0-9]%'

drop table mytable 

Résultats

mycol
----------------------------------------
efg%^&hji
apostrophe ' in a sentence
61
beach

Le serveur SQL a un support Regex très limité. Vous pouvez utiliser PATINDEX avec quelque chose comme ça

PATINDEX('%[a-zA-Z0-9]%',Col)

Jetez un œil à PATINDEX (Transact-SQL)

et Correspondance de motifs dans les conditions de recherche

8
Adriaan Stander

J'ai trouvé this page avec une solution assez soignée. Ce qui le rend génial, c'est que vous obtenez une indication de ce qu'est le personnage et où il se trouve. Ensuite, il donne un moyen super simple de le réparer (qui peut être combiné et intégré dans un morceau de code de pilote pour faire évoluer son application).

DECLARE @tablename VARCHAR(1000) ='Schema.Table'
DECLARE @columnname VARCHAR(100)='ColumnName'
DECLARE @counter INT = 0
DECLARE @sql VARCHAR(MAX)

WHILE @counter <=255
BEGIN

SET @sql=

'SELECT TOP 10 '+@columnname+','+CAST(@counter AS VARCHAR(3))+' as CharacterSet, CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') as LocationOfChar
FROM '+@tablename+'
WHERE CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') <> 0'

PRINT (@sql)
EXEC (@sql)
SET @counter = @counter + 1
END

puis...

UPDATE Schema.Table
SET ColumnName= REPLACE(Columnname,CHAR(13),'')

Nous remercions Ayman El-Ghazali.

2
wwmbes