2009-09-07 9 views
79

Une table Je ne contrôle pas du schéma pour, contient une colonne définie comme varchar (50) qui stocke uniqueidentifiers dans le format « a89b1acd95016ae6b9c8aabb07da2010 » (pas de traits d'union)Convertir varchar à uniqueIdentifier dans SQL Server

Je veux convertissez-les en identifiants uniques dans SQL pour passer à un guide .Net. Cependant, les lignes de requête suivantes ne fonctionnent pas pour moi:

select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier) 
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010') 

et entraînent:

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

Les mêmes requêtes à l'aide d'un travail césure uniqueidentifier bien, mais les données ne sont pas stockées dans ce format.

Existe-t-il un autre moyen (efficace) de convertir ces chaînes en identificateurs uniques dans SQL? - Je ne veux pas le faire dans le code .Net.

+0

juste une rangée de caractères et de chiffres est vraiment pas une représentation GUID valide - Vous devrez recourir à la magie des pars, comme Quassnoi l'a montré dans sa réponse. –

Répondre

101
DECLARE @uuid VARCHAR(50) 
SET @uuid = 'a89b1acd95016ae6b9c8aabb07da2010' 
SELECT CAST(
     SUBSTRING(@uuid, 1, 8) + '-' + SUBSTRING(@uuid, 9, 4) + '-' + SUBSTRING(@uuid, 13, 4) + '-' + 
     SUBSTRING(@uuid, 17, 4) + '-' + SUBSTRING(@uuid, 21, 12) 
     AS UNIQUEIDENTIFIER) 
+6

J'espérais vraiment que ce ne serait pas la solution mais je suppose que nous le saurons bientôt ... – grenade

+16

DECLARE @u uniqueidentifier SELECT @u = CONVERT (identifiant unique, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') * ** Ce serait suffisant. Je l'ai juste essayé. –

+7

@Fabio: veuillez lire la question plus attentivement. – Quassnoi

15

votre varchar col C:

SELECT CONVERT(uniqueidentifier,LEFT(C, 8) 
           + '-' +RIGHT(LEFT(C, 12), 4) 
           + '-' +RIGHT(LEFT(C, 16), 4) 
           + '-' +RIGHT(LEFT(C, 20), 4) 
           + '-' +RIGHT(C, 12)) 
21

Il ferait une fonction pratique. Notez également que j'utilise STUFF au lieu de SUBSTRING.

create function str2uniq(@s varchar(50)) returns uniqueidentifier as begin 
    -- just in case it came in with 0x prefix or dashes... 
    set @s = replace(replace(@s,'0x',''),'-','') 
    -- inject dashes in the right places 
    set @s = stuff(stuff(stuff(stuff(@s,21,0,'-'),17,0,'-'),13,0,'-'),9,0,'-') 
    return cast(@s as uniqueidentifier) 
end 
+2

Excellente utilisation de Stuff(). J'ai seulement besoin de référencer mon champ une fois dans une instruction Select en utilisant votre méthode. J'évite cependant les fonctions scalaires, car elles ne sont pas toujours bien "à l'échelle", donc je les écris. Merci, ceci se passe dans mes extraits de code! – MikeTeeVee

0

Si votre chaîne contient des caractères spéciaux, vous pouvez la convertir en md5 et la convertir en guid/uniqueidentifier.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010')) 
+3

Ceci convertit la chaîne d'entrée à un GUID complètement différent – Aaroninus

-3

vous êtes fourni guid n'est pas le format correct (.net fourni guid).

commencent essayer select convert (uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010') fin try commencer capture print '1' prises de fin

+1

Comment cela répond-il à la question de convertir un varchar sans tiret en GUID? Tout ce code est impression 1. – Aaroninus

4
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-')) 
Questions connexes