Преобразование varchar в uniqueidentifier в SQL Server

В таблице, в которой я не контролирую схему, содержится столбец, определяемый как varchar (50), который хранит уникальные идентификаторы в формате "a89b1acd95016ae6b9c8aabb07da2010" (без дефиса)

Я хочу преобразовать их в uniqueidentifiers в SQL для перехода в .Net Guid. Однако для меня не работают следующие строки запроса:

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

и результат:

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

Те же запросы, что и с использованием дешифрированного уникального идентификатора, работают нормально, но данные не сохраняются в этом формате.

Есть ли другой (эффективный) способ преобразования этих строк в uniqueidentifiers в SQL. - Я не хочу делать это в коде .Net.

Ответ 1

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)

Ответ 2

Это сделало бы для удобной функции. Кроме того, обратите внимание, что я использую STUFF вместо 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

Ответ 3

ваш 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))

Ответ 4

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

Ответ 5

Если ваша строка содержит специальные символы, вы можете хешировать ее до md5, а затем преобразовать ее в guid/uniqueidentifier.

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

Ответ 6

Указанный гид не является правильным форматом (.net Guid).

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