Перетворити varchar в унікальний ідентифікатор в SQL Server


104

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

Я хочу перетворити їх на uniqueidentifiers в 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)

10
Я дуже сподівався, що це не буде рішенням, але, мабуть, ми дізнаємось незабаром ...
гранату

22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Цього буде достатньо. Просто спробував.
Фабіо Мілхейро

О, так! Тоді я повинен погодитися. Очевидна річ - поставити дефіси в потрібних місцях і ви готові йти! Вибачте!
Фабіо Мілхейро

Розміщення цього фрагмента у функції є приємним доповненням до набору інструментів, тим більше, що деякі серіалізатори JSON видаляють тире з GUID під час серіалізації, що ускладнює копіювання пасти у SQL для налагодження.
Девід Кампс

27

Це зробило б зручною функцію. Також зауважте, що я використовую STUFF замість підписування.

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, використовуючи ваш метод. Я уникаю функцій Scalar-Functions, оскільки вони не завжди добре «масштабуються», тому я виписую це. Дякую, це відбувається в моєму Code Snippits!
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, а потім перетворити її на керівний / унікальний ідентифікатор.

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

8
Це перетворює вхідний рядок у зовсім інший GUID
Aaroninus

-6

Наведена настанова не є правильним форматом (.net надається настановою).

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

6
Як це відповідає на питання перетворення вархара без дефісів до GUID? Весь цей код - це друк 1.
Ааронін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.