Converta varchar em identificador exclusivo no SQL Server

104

Uma tabela para a qual não tenho controle do esquema contém uma coluna definida como varchar (50) que armazena identificadores exclusivos no formato 'a89b1acd95016ae6b9c8aabb07da2010' (sem hífens)

Quero convertê-los em identificadores exclusivos em SQL para passar para um .Net Guid. No entanto, as seguintes linhas de consulta não funcionam para mim:

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

e resultar em:

Msg 8169, Nível 16, Estado 2, Linha 1
A conversão falhou ao converter de uma sequência de caracteres em identificador único.

As mesmas consultas usando um identificador exclusivo hifenizado funcionam bem, mas os dados não são armazenados nesse formato.

Existe outra maneira (eficiente) de converter essas strings em identificadores exclusivos em SQL. - Não quero fazer no código .Net.

Grenade
fonte
apenas uma linha de caracteres e números não é realmente uma representação GUID válida - você terá que recorrer à mágica de análise de strings como Quassnoi mostrou em sua resposta.
marc_s

Respostas:

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
fonte
10
Eu realmente esperava que esta não fosse a solução, mas acho que descobriremos em breve ...
granada
22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Isso seria o suficiente. Apenas tentei.
Fabio Milheiro
Ai sim! Então eu tenho que concordar. O óbvio é colocar os hífens nos lugares certos e você está pronto para começar! Desculpe!
Fabio Milheiro
Colocar este snippet em uma função é uma boa adição ao seu kit de ferramentas, especialmente porque alguns serializadores JSON removem os traços dos GUIDs ao serializar, tornando mais difícil copiar e colar no SQL para depurar.
David Cumps
27

Seria uma função útil. Além disso, observe que estou usando STUFF em vez 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
fonte
4
Excelente uso de Stuff (). Eu só preciso fazer referência ao meu campo uma vez em uma instrução Select usando seu método. Eu evito funções escalares, porém, porque elas nem sempre "escalam" bem, então eu as escrevo. Obrigado, isso vai nos meus trechos de código!
MikeTeeVee
18

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

Se sua string contiver caracteres especiais, você pode hash para md5 e então convertê-la em um guid / identificador único.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Sven
fonte
8
Isso converte a string de entrada em um GUID completamente diferente
Aaroninus,
-6

O guid fornecido não está no formato correto (guid fornecido .net).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
user3082965
fonte
6
Como isso responde à questão de converter um varchar sem hifens em um GUID? Tudo o que esse código faz é imprimir 1.
Aaroninus