Преобразование varchar в uniqueidentifier в SQL Server
таблица, для которой я не контролирую схему, содержит столбец, определенный как varchar (50), который хранит uniqueidentifiers в формате 'a89b1acd95016ae6b9c8aabb07da2010' (без дефисов)
Я хочу, чтобы преобразовать их в uniqueidentifiers в SQL для прохождения на .Чистый Код 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.
те же запросы, использующие дефис uniqueidentifier работают нормально, но данные не являются хранится в таком формате.
есть ли другой (эффективный) способ преобразования этих строк в uniqueidentifiers в SQL. -- Я не хочу делать это в коде .Net.
6 ответов:
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)
Это удобная функция. Кроме того, обратите внимание, что я использую материал вместо подстроки.
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
ваш 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))
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))