Convertir varchar en identifiant unique dans SQL Server

Une table pour laquelle je ne contrôle pas le schéma contient une colonne définie comme varchar (50) qui stocke des identificateurs uniques au format ‘a89b1acd95016ae6b9c8aabb07da2010’ (pas de tirets)

Je veux les convertir en identificateurs 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 uniqueidentifier. 

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.

 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) 

Cela ferait une fonction pratique. Notez aussi 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 

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

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

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

Vous êtes informé que guid n’est pas le format correct (.net fourni guide).

begin try select convert (identifiant unique, ‘a89b1acd95016ae6b9c8aabb07da2010’) end try begin catch print ‘1’ fin catch