Konwertuj varchar na uniqueidentifier w SQL Server

104

Tabela, dla której nie mam kontroli nad schematem, zawiera kolumnę zdefiniowaną jako varchar (50), która przechowuje unikalne identyfikatory w formacie „a89b1acd95016ae6b9c8aabb07da2010” (bez łączników)

Chcę przekonwertować je na uniqueidentifiers w SQL w celu przekazania do .Net Guid. Jednak następujące wiersze zapytania nie działają dla mnie:

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

i skutkuje:

Msg 8169, poziom 16, stan 2, wiersz 1
Konwersja nie powiodła się podczas konwersji z ciągu znaków na unikalny identyfikator.

Te same zapytania używające łączonego unikalnego identyfikatora działają dobrze, ale dane nie są przechowywane w tym formacie.

Czy istnieje inny (wydajny) sposób konwersji tych ciągów na unikalne identyfikatory w języku SQL? - Nie chcę tego robić w kodzie .Net.

granat
źródło
tylko wiersz znaków i liczb nie jest w rzeczywistości poprawną reprezentacją GUID - będziesz musiał uciekać się do magii parsowania ciągów, tak jak Quassnoi pokazał w swojej odpowiedzi.
marc_s

Odpowiedzi:

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
źródło
10
Naprawdę liczyłem na to, że to nie będzie rozwiązanie, ale myślę, że wkrótce się dowiemy ...
granat
22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** To wystarczy. Po prostu spróbowałem.
Fabio Milheiro,
O tak! W takim razie muszę się zgodzić. Oczywistą rzeczą jest umieszczenie łączników we właściwych miejscach i gotowe! Przepraszam!
Fabio Milheiro,
Umieszczenie tego fragmentu kodu w funkcji jest miłym dodatkiem do zestawu narzędzi, zwłaszcza, że ​​niektóre serializatory JSON usuwają kreski z identyfikatorów GUID podczas serializacji, co utrudnia kopiowanie wklejania do SQL w celu debugowania.
David Cumps
27

To byłaby przydatna funkcja. Zauważ też, że używam STUFF zamiast 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
Hafthor
źródło
4
Doskonałe wykorzystanie Stuff (). Muszę tylko raz odwołać się do mojego pola w instrukcji Select przy użyciu Twojej metody. Unikam jednak funkcji skalarnych, ponieważ nie zawsze dobrze „skalują się”, więc piszę to. Dzięki, to się dzieje w moich fragmentach kodu!
MikeTeeVee
18

Twój 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))
manji
źródło
10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
Mateusz
źródło
-4

Jeśli twój ciąg zawiera znaki specjalne, możesz go zaszyfrować do md5, a następnie przekonwertować na identyfikator guid / uniqueidentifier.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Sven
źródło
8
To konwertuje ciąg wejściowy na zupełnie inny identyfikator GUID
Aaroninus
-6

Podany identyfikator guid ma nieprawidłowy format (identyfikator podany .net).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
user3082965
źródło
6
Jak to odpowiada na pytanie o konwersję zmiennej varchar bez łączników na identyfikator GUID? Wszystko, co robi ten kod, to
wypisanie