2009-03-27 6 views
2

Je suis en train de convertir un varchar (50) à une colonne uniqueidentifier, mais cette erreur cesse d'apparaître tout le temps, et je ne sais pas pourquoi:SQL Server 2008 Conversion VARCHAR (50) à Uniqueidentifier

"Msg 8169, Level 16, State 2, Line 1 Conversion failed when converting from a character string to uniqueidentifier." 

Les données de la colonne sont actuellement un identifiant unique valide.

Quelle est la bonne façon de faire ce que je veux?

Merci

+0

Quelle est la chaîne que vous essayez de convertir s'il vous plaît? – gbn

Répondre

5

Avez-vous des colonnes contenant des chaînes vides? C'est à dire. NOT NULL, longueur de chaîne = 0.

Ou avez-vous des GUID avec des caractères non standard? C'est à dire. pas 0-9, A-F?

Nous avons quelques GUIDs non standard dans ma demande qui ont été créés avant hérité ...

EDIT:

Pour l'avenir de l'aide, ce script peut vous aider à trouver toutes les lignes qui ne sont pas valide:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GUID, '1', '0'), '2', '0'), '3', '0'), '4', '0'), '5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'), 'A', '0'), 'B', '0'), 'C', '0'), 'D', '0'), 'E', '0'), 'F', '0'), COUNT(*) 
FROM TABLE 
GROUP BY REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GUID, '1', '0'), '2', '0'), '3', '0'), '4', '0'), '5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'), 'A', '0'), 'B', '0'), 'C', '0'), 'D', '0'), 'E', '0'), 'F', '0') 

Toutes les lignes qui ont Guids invalides montreront, et peuvent être trouvés par:

SELECT *, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GUID, '1', '0'), '2', '0'), '3', '0'), '4', '0'), '5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'), 'A', '0'), 'B', '0'), 'C', '0'), 'D', '0'), 'E', '0'), 'F', '0') 
FROM TABLE 
WHERE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GUID, '1', '0'), '2', '0'), '3', '0'), '4', '0'), '5', '0'), '6', '0'), '7', '0'), '8', '0'), '9', '0'), 'A', '0'), 'B', '0'), 'C', '0'), 'D', '0'), 'E', '0'), 'F', '0') != '00000000-0000-0000-0000-0000000000' 
0

Merci pour les réponses. Sur 5000 lignes, j'en avais une contenant un caractère non hexadécimal.

0

Je sais que cela a déjà été répondu, mais il y a une approche légèrement plus élégante. Vous pouvez utiliser la syntaxe simple d'expression rationnelle à un seul caractère (c'est-à-dire []) autorisée dans une clause LIKE pour tester les chiffres hexadécimaux valides (c'est-à-dire 0 - 9 et A - F). Et en utilisant une clause LIKE avec la recherche de caractère unique, vous pouvez également appliquer le format d'un GUID/UNIQUEIDENTIFIER valide d'une manière plus lisible que la méthode REPLACE qui doit d'abord normaliser tous les chiffres hexadécimaux à 0 avant de comparer au format valide.

L'exemple ci-dessous montre l'utilisation de 32 ensembles de [0-9A-F] pour chaque position hexadécimale du GUID et a les tirets (-) aux endroits appropriés.

SET NOCOUNT ON 
IF (OBJECT_ID('tempdb.dbo.#GUIDs') IS NOT NULL) 
BEGIN 
    DROP TABLE #GUIDs 
END 

CREATE TABLE #GUIDs (ID INT NOT NULL, TheGUID VARCHAR(50) NULL) 
INSERT INTO #GUIDs (ID, TheGUID) 
    SELECT tmp.ID, tmp.TheGUID 
    FROM (
     SELECT 1, 'E1A21B62-ACC4-4ACB-B284-0F0233F19EDA' -- valid 
     UNION ALL 
     SELECT 2, '50178543-11E6-40D2-87F1-9C4676DCF542' -- valid 
     UNION ALL 
     SELECT 3, '' -- invalid: empty string 
     UNION ALL 
     SELECT 4, '4EB30267-0EB4-413A-9B05-6EDDB943C7D8' -- valid 
     UNION ALL 
     SELECT 5, '4EB30267-0EB4-413A-9Z05-6EDDB943C7D8' -- invalid: has a "Z" 
     UNION ALL 
     SELECT 6, NULL -- invalid: is NULL 
     UNION ALL 
     SELECT 7, '18EAE6C5-7256-4598-AA0A-837718145001' -- valid 
     ) tmp (ID, TheGUID) 

SELECT ID, TheGUID, CONVERT(UNIQUEIDENTIFIER, TheGUID) AS [Converted] 
FROM #GUIDs 
WHERE TheGUID LIKE '[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]' 

SELECT ID, TheGUID AS [BAD] 
FROM #GUIDs 
WHERE TheGUID NOT LIKE '[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F]-[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]' 
OR  TheGUID IS NULL