web-dev-qa-db-fra.com

Convertir varchar en uniqueidentifier dans SQL Server

Une table pour laquelle je n'ai aucun contrôle sur le schéma contient une colonne définie comme varchar (50) qui stocke des identifiants uniques au format 'a89b1acd95016ae6b9c8aabb07da2010' (aucun trait d'union).

Je veux convertir ceux-ci en identifiants uniques en SQL pour les transmettre à un .Net Guid. Cependant, les lignes de requête suivantes ne fonctionnent pas pour moi:

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

et aboutir à:

Msg 8169, Niveau 16, État 2, Ligne 1 
 La conversion a échoué lors de la conversion d'une chaîne de caractères en identificateur unique.

Les mêmes requêtes utilisant un identifiant unique avec trait d'union fonctionnent correctement, 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 en SQL? - Je ne veux pas le faire dans le code .Net.

94
grenade
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)
116
Quassnoi

Cela 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
25
Hafthor

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))
18
manji
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
6
Matthew