2009-09-28 2 views
0

Nous avons découvert que nous avons un ensemble de chaînes françaises avec des caractères incorrects. Nous savons que la représentation hexadécimale du caractère est 0xFDFF. Existe-t-il un moyen facile de sélectionner les lignes dans une table où le champ NVarchar contient ce caractère?Recherche d'une combinaison d'octets spécifique dans NVARCHAR

Merci

Répondre

0

Merci pour toute l'aide Arthur, +1 pour toi.
J'ai fini par créer un curseur et vérifier tous les caractères dans chaque rangée de la table pour trouver le caractère étrange 0xFDFF. J'ai concaténé tous les identifiants dans une variable et j'ai obtenu ma liste à partir de là.

DECLARE CURSOR ... 
.... 
WHILE @@FETCH_STATUS = 0 
BEGIN 

     Declare @pos int 
     set @Pos = 0 

     while @Pos <= Len(@Str) 
     begin 
      if(convert(binary(2), substring(@Str, @pos, 1), 0) = 0xFDFF) 
      begin 
       set @ids = @ids + ',' + cast(@TheId as varchar) 
       --Select @TheId, @Str 
       break 
      end 
      set @Pos = @Pos + 1 
     end 

     FETCH NEXT FROM db_cursor INTO @TheId, @Str 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

select @ids 
2
WRONG: select * from YourTable where YourCol like '%' + CONVERT(nchar, 0xFDFF) + '%' 

EDIT: oups , (n) char (x) piège

right: select * from sys.sysobjects where name like '%' + CONVERT(nchar(1), 0x4800) + '%' 

EDIT2:

select * from sys.sysobjects where charindex(CONVERT(nvarchar(1), 0xFDFF), name) > 0 
+0

D'une certaine manière, cela ne fonctionne pas. Probablement parce que ce personnage n'est pas un personnage normal. – pauloya

+0

select CONVERT (nchar, 0xFDFF) renvoie un caractère. Quel est le problème? Aucun résultat? Ou une erreur de syntaxe? – Arthur

+0

Aucun résultat, et je connais au moins 2 lignes qui ont ce caractère. Je le vois quand je sélectionne convert (binary, FieldName, 1). – pauloya

0

question ancienne mais je ne l'ai pas encore trouvé une solution précise pour trouver le caractère 0xFDFF invalide dans la colonne nvarchar. Enfin, cela devrait fonctionner dans la plupart, sinon dans tous les cas:

CHARINDEX('FDFF',CONVERT(varchar(max),(CAST(fname AS VARBINARY(max))),2)) > 0