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

104

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

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

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

и результат:

Msg 8169, уровень 16, состояние 2, строка 1
Ошибка преобразования при преобразовании из символьной строки в уникальный идентификатор.

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

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

граната
источник
просто строка символов и чисел на самом деле не является допустимым представлением GUID - вам придется прибегнуть к магии синтаксического анализа строк, как показал Квассной в своем ответе.
marc_s

Ответы:

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
источник
10
Я действительно надеялся, что это не решение, но я думаю, мы скоро узнаем ...
граната
22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Этого будет достаточно. Просто попробовал.
Фабио Мильейро
О да! Тогда я должен согласиться. Очевидно, что дефисы нужно расставить в нужных местах, и все готово! Сожалею!
Фабио Мильейро,
Размещение этого фрагмента в функции - хорошее дополнение к вашему набору инструментов, тем более что некоторые сериализаторы JSON удаляют тире из идентификаторов GUID при сериализации, что затрудняет копирование вставки в SQL для отладки.
Дэвид Кампс
27

Это было бы удобной функцией. Также обратите внимание, что я использую 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
Хафтор
источник
4
Отличное использование Stuff (). Мне нужно только один раз сослаться на мое поле в инструкции Select с использованием вашего метода. Я избегаю скалярных функций, потому что они не всегда хорошо "масштабируются", поэтому я записываю их. Спасибо, это входит в мои фрагменты кода!
MikeTeeVee
18

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

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

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Свен
источник
8
Это преобразует входную строку в совершенно другой GUID
Ааронин
-6

Предоставленное руководство имеет неправильный формат (предоставленное руководство .net).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
user3082965
источник
6
Как это отвечает на вопрос о преобразовании varchar без дефисов в GUID? Все, что делает этот код, - это печать 1.
Ааронин