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

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

Я хочу преобразовать их в уникальные идентификаторы в 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.

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

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


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


Ответы (5)


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

ваш 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))
person manji    schedule 07.09.2009

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

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
person Sven    schedule 26.08.2014
comment
Это преобразует входную строку в совершенно другой GUID. - person Aaroninus; 11.09.2015

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

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
person user3082965    schedule 13.01.2015
comment
Как это отвечает на вопрос о преобразовании varchar без дефисов в GUID? Все, что делает этот код, выводит 1. - person Aaroninus; 11.09.2015

person    schedule
comment
Я действительно надеялся, что это не решение, но думаю, скоро мы узнаем ... - person grenade; 07.09.2009
comment
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Этого будет достаточно. Просто попробовал. - person Fabio Milheiro; 14.04.2011
comment
О, да! Тогда я должен согласиться. Очевидно, что расставьте дефисы в нужных местах, и вы готовы к работе! Прости! - person Fabio Milheiro; 14.04.2011
comment
Размещение этого фрагмента в функции - хорошее дополнение к вашему набору инструментов, тем более что некоторые сериализаторы JSON удаляют тире из идентификаторов GUID при сериализации, что затрудняет копирование вставки в SQL для отладки. - person David Cumps; 23.01.2013