Varchar converteren naar uniqueidentifier in SQL Server

Een tabel waarvoor ik geen controle heb over het schema, bevat een kolom gedefinieerd als varchar(50) die uniqueidentifiers opslaat in het formaat ‘a89b1acd95016ae6b9c8aabb07da2010’ (geen koppeltekens)

Ik wil deze omzetten naar uniqueidentifiers in SQL om ze door te geven aan een .Net Guid. De volgende vraagregels werken echter niet voor mij:

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

en resulteren in:

Msg 8169, Level 16, State 2, Line 1
Conversie mislukt bij het converteren van een tekenreeks naar uniqueidentifier.

Dezelfde zoekopdrachten met een koppelteken unieke identificatie werken prima, maar de gegevens worden niet in die indeling opgeslagen.

Is er een andere (efficiënte) manier om deze strings om te zetten naar uniqueidentifiers in SQL. — Ik wil het niet in de .Net-code doen.


Antwoord 1, autoriteit 100%

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)

Antwoord 2, autoriteit 20%

Het zou een handige functie zijn. Merk ook op dat ik STUFF gebruik in plaats van 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

Antwoord 3, autoriteit 13%

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

Antwoord 4, autoriteit 9%

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

Antwoord 5

De verstrekte gids heeft niet het juiste formaat (.net verstrekte gids).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch

Other episodes