132 votes

Convertir varchar en uniqueidentifier dans SQL Server

Une table dont je ne contrôle pas le schéma contient une colonne définie comme varchar(50) qui stocke des identifiants uniques au format 'a89b1acd95016ae6b9c8aabb07da2010' (sans tiret).

Je veux les convertir en identifiants uniques en SQL pour les 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 se traduisent par :

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

Les mêmes requêtes utilisant un identifiant unique avec trait d'union fonctionnent 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 votes

Une simple rangée de caractères et de chiffres n'est vraiment pas une représentation GUID valide - vous devrez recourir à la magie de l'analyse des chaînes de caractères comme Quassnoi l'a montré dans sa réponse.

152voto

Quassnoi Points 191041
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)

13 votes

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

28 votes

DECLARE @u uniqueidentifier SELECT @u = CONVERT(uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Cela devrait suffire. Je viens de l'essayer.

0 votes

Oh oui ! Alors je suis d'accord. La chose évidente est de mettre les traits d'union aux bons endroits et vous êtes prêt à partir ! Je suis désolé.

32voto

Hafthor Points 5663

Ce serait une fonction très 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

5 votes

Excellente utilisation de Stuff(). Je n'ai besoin de référencer mon champ qu'une seule fois dans une instruction Select en utilisant votre méthode. J'évite cependant les fonctions scalaires, car elles ne sont pas toujours très " évolutives ", alors je les écris. Merci, cela va être ajouté à mes extraits de code !

21voto

manji Points 26778

Votre col varchar 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))

19voto

Matthew Points 111
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))

-4voto

Sven Points 2176

Si votre chaîne contient des caractères spéciaux, vous pouvez la hacher en md5, puis la convertir en un guid/identifiant unique.

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

8 votes

Cela convertit la chaîne d'entrée en un GUID complètement différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X