2010-11-16 22 views
0

J'ai une base de données qui a été migrée d'Oracle vers SQL Server. L'une des tables a données comme:corriger les mauvais caractères dans SQL?

Name 
steve 
mark 
john 
matt 

quand je fais cette requête:

select * from [TABLE] where Name = 'steve' 

rien est retourné. Si j'utilise SSMS et modifiez la colonne en l'annulant, puis en retapant les données, la requête fonctionne. Ainsi, quelque chose se trouve dans cette chaîne de caractères à la suite de la migration qui n'est pas affichée.

Y a-t-il un moyen d'afficher les données les plus "brutes" de la colonne afin que je puisse essayer de comprendre ce que ces mauvaises données sont?

Merci

MISE À JOUR:

J'ai changé ma requête un peu et trouvé quelque chose d'intéressant:

SELECT LEN(RTRIM(Name)) from [Table] 

et ce que je suis arrivé était longueurs plus longues que 5,4,4,4 ... donc il y a certainement des caractères après les noms mais ils ne sont pas des espaces.

Malheureusement j'ai des valeurs telles que:

steve 
steve1 
steve12 

donc je ne peux pas simplement aller

where NAME like 'steve%' 

car il mal saisir les trois lignes.

MISE A JOUR (SOLUTION):

Eh oui, il était un peu char (13) + 10 .. de je la tâche de générer des scripts dans SSMS pour générer des inserts et il a montré quelques sauts de ligne. Je viens de faire une mise à jour avec REMPLACER et tout va bien. Merci à tous!

+3

Etes-vous sûr que ce n'est pas simplement un problème d'espace après les noms? – Oded

+0

Je crois que la question de l'espace n'est pas un problème. Si je change la requête à 'select * from [TABLE] où RTRIM (name) =' steve '' cela ne fonctionne toujours pas –

Répondre

1

Je ne pense pas que le problème serait un espace après le nom. Je ne pense pas que SQL Server le stockerait de toute façon. Qu'en est-il des espaces leaders?

Et, oui, vous pouvez obtenir les données brutes en scriptant les données de la table. Dans SSMS, vous pouvez cliquer avec le bouton droit de la souris sur le nom de la base de données dans l'Explorateur d'objets, sélectionner Tâches, puis Générer des scripts ... Cela vous permettra de générer un script de schéma et un script de données. Vous pouvez alors voir si vous avez des espaces de début ou de fin.

+0

Cela aide .. les scripts montrent un caractère de nouvelle ligne là ... maintenant, quel est le codé valeur pour newline dans t-sql ... google, ne me manquez pas maintenant! –

+1

@MBonig ce sera probablement un CHAR (10) ou CHAR (13) ... Si vous voulez le savoir rapidement, essayez quelque chose comme 'SELECT ASCII (SUBSTRING (nom, 6, 1)) FROM [TABLE] O WH NAME comme 'steve%' ':) Dans ce contexte, ASCII saisira la valeur ASCII d'un caractère, et CHAR créera un caractère basé sur une valeur ASCII. –

+0

Ouais, c'était un peu de char (13) + 10's. J'ai utilisé la tâche de génération de scripts dans SSMS pour générer des inserts et il y avait des retours à la ligne.Je viens de faire une mise à jour avec REMPLACER et tout va bien. Merci à tous! –

0

Vous pouvez également créer une fonction UDF pour omettre des caractères non-alphanum. Exemple:

Create Function dbo.ReplaceNonAlphaNum(@val varchar(255)) Returns Varchar(255) 
BEGIN 
    DECLARE @index int 

    Set @index = patindex('%[^a-z0-9_]%',@val) 
    While @index > 0 
    Begin 
     Set @val = stuff(@val,@index,1,'') 
     Set @index = patindex('%[^a-z0-9_]%',@val) 
    End 

    Return @val 
END 
GO 

Grant Exec on dbo.ReplaceNonAlphaNum to Public 
GO 

-- Test 
SELECT dbo.ReplaceNonAlphaNum('[email protected]#!123^') 
--should give a result of: 'abc123'