Convierta varchar en un identificador único en SQL Server

104

Una tabla para la que no tengo control del esquema, contiene una columna definida como varchar (50) que almacena identificadores únicos en el formato 'a89b1acd95016ae6b9c8aabb07da2010' (sin guiones)

Quiero convertirlos en identificadores únicos en SQL para pasarlos a .Net Guid. Sin embargo, las siguientes líneas de consulta no me funcionan:

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

y resultar en:

Msg 8169, nivel 16, estado 2, línea 1
La conversión falló al convertir de una cadena de caracteres a un identificador único.

Las mismas consultas que utilizan un identificador único con guiones funcionan bien, pero los datos no se almacenan en ese formato.

¿Existe otra forma (eficiente) de convertir estas cadenas en identificadores únicos en SQL? - No quiero hacerlo en el código .Net.

granada
fuente
solo una fila de caracteres y números no es realmente una representación GUID válida; tendrá que recurrir a la magia de análisis de cadenas como lo mostró Quassnoi en su respuesta.
marc_s

Respuestas:

126
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)
Quassnoi
fuente
10
Realmente esperaba que esta no fuera la solución, pero supongo que lo descubriremos pronto ...
granada
22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Esto sería suficiente. Sólo lo probé.
Fabio Milheiro
¡Oh si! Entonces tengo que estar de acuerdo. ¡Lo obvio es colocar los guiones en los lugares correctos y estará listo para comenzar! ¡Lo siento!
Fabio Milheiro
Colocar este fragmento en una función es una buena adición a su kit de herramientas, especialmente porque algunos serializadores JSON eliminan los guiones de los GUID al serializar, lo que dificulta copiar y pegar en SQL para depurar.
David Cumps
27

Sería una función útil. Además, tenga en cuenta que estoy usando COSAS en lugar 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
Hafthor
fuente
4
Excelente uso de Stuff (). Solo necesito hacer referencia a mi campo una vez en una instrucción Select usando su método. Sin embargo, evito las funciones escalares porque no siempre "escalan" bien, así que las escribo. Gracias, esto va en mis fragmentos de código.
MikeTeeVee
18

su 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))
manji
fuente
10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
Mateo
fuente
-4

Si su cadena contiene caracteres especiales, puede convertirla en md5 y luego convertirla en un guid / identificador único.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Sven
fuente
8
Esto convierte la cadena de entrada en un GUID completamente diferente
Aaroninus
-6

El guid proporcionado no tiene el formato correcto (.net proporcionado guid).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
usuario3082965
fuente
6
¿Cómo responde esto a la pregunta de convertir un varchar sin guiones en un GUID? Todo lo que hace este código es imprimir 1.
Aaroninus