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.


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)

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

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

10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.