2009-09-07 79 views
79

Una tabla que no tengo control del esquema para, contiene una columna definida como VARCHAR (50) que almacena uniqueidentifiers en el formato 'a89b1acd95016ae6b9c8aabb07da2010' (sin guiones)Convertir varchar a UNIQUEIDENTIFIER en SQL Server

que quiero conviértalos a uniqueidentifiers en SQL para pasar a .Net Guid. Sin embargo, las siguientes líneas de consulta no funcionan para mí:

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

y dan lugar a:

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

Las mismas consultas utilizando un guión excelente trabajo uniqueidentifier pero los datos no se almacenan en ese formato.

Hay otra forma (eficiente) de convertir estas cadenas en uniqueidentifiers en SQL. - No quiero hacerlo en el código .Net.

+0

sólo una fila de caracteres y números no es realmente una representación GUID válido - Tendrás que recurrir a la magia de análisis de cuerdas como lo mostró Quassnoi en su respuesta. –

Respuesta

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

Realmente esperaba que esta no fuera la solución, pero creo que pronto lo sabremos ... – grenade

+16

DECLARAR @u uniqueidentifier SELECCIONAR @u = CONVERTIR (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') * ** Esto sería suficiente. Solo lo probé. –

+7

@Fabio: por favor lea la pregunta con más cuidado. – Quassnoi

15

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)) 
21

que haría para una función muy útil. Además, tenga en cuenta que estoy usando STUFF 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 
+2

Excelente uso de material(). Solo necesito hacer referencia a mi campo una vez en una declaración Select usando su método. Sin embargo, evito Scalar-Functions, porque no siempre se "escalan" bien, así que lo escribo. Gracias, esto va en mis Code Snippits! – MikeTeeVee

0

Si la cadena contiene caracteres especiales que puede hash MD5 y luego convertirlo a un GUID/uniqueidentifier.

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

Esto convierte la cadena de entrada a un GUID completamente diferente – Aaroninus

-3

se proporciona guid no es el formato correcto (.net Provided guid).

comienzan tratar select convert (uniqueidentifier 'a89b1acd95016ae6b9c8aabb07da2010') End Try comenzar la captura de impresión '1' enganchar final

+1

¿Cómo responde esto la pregunta de convertir un varchar sin guiones a un GUID? Todo lo que este código hace es imprimir 1. – Aaroninus

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