Konvertieren Sie varchar in eine eindeutige Kennung in SQL Server

104

Eine Tabelle, für die ich keine Kontrolle über das Schema habe, enthält eine als varchar (50) definierte Spalte, in der eindeutige Kennungen im Format 'a89b1acd95016ae6b9c8aabb07da2010' (keine Bindestriche) gespeichert sind.

Ich möchte diese in eindeutige Kennungen in SQL konvertieren, um sie an eine .Net Guid zu übergeben. Die folgenden Abfragezeilen funktionieren bei mir jedoch nicht:

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

und führen zu:

Nachricht 8169, Ebene 16, Status 2, Zeile 1
Die Konvertierung ist beim Konvertieren von einer Zeichenfolge in eine eindeutige Kennung fehlgeschlagen.

Dieselben Abfragen mit einer getrennten eindeutigen Kennung funktionieren einwandfrei, aber die Daten werden nicht in diesem Format gespeichert.

Gibt es eine andere (effiziente) Möglichkeit, diese Zeichenfolgen in eindeutige Kennungen in SQL zu konvertieren? - Ich möchte es nicht im .NET-Code tun.

Granate
quelle
Nur eine Reihe von Zeichen und Zahlen ist wirklich keine gültige GUID-Darstellung - Sie müssen auf die Magie des String-Parsens zurückgreifen, wie Quassnoi in seiner Antwort gezeigt hat.
marc_s

Antworten:

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
quelle
10
Ich hatte wirklich gehofft, dass dies nicht die Lösung sein würde, aber ich denke, wir werden es bald herausfinden ...
Granate
22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Dies würde ausreichen. Ich habe es gerade versucht.
Fabio Milheiro
Oh ja! Dann muss ich zustimmen. Das Offensichtliche ist, die Bindestriche an den richtigen Stellen zu platzieren und schon kann es losgehen! Es tut uns leid!
Fabio Milheiro
Das Platzieren dieses Snippets in einer Funktion ist eine nette Ergänzung zu Ihrem Toolkit, insbesondere da einige JSON-Serialisierer die Striche bei der Serialisierung aus den GUIDs entfernen, was das Kopieren und Einfügen in SQL zum Debuggen erschwert.
David Cumps
27

Es wäre eine praktische Funktion. Beachten Sie auch, dass ich STUFF anstelle von SUBSTRING verwende.

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
quelle
4
Hervorragende Verwendung von Stuff (). Ich muss mein Feld nur einmal in einer Select-Anweisung mit Ihrer Methode referenzieren. Ich vermeide jedoch Skalarfunktionen, weil sie nicht immer gut "skalieren", also schreibe ich es aus. Danke, das geht in meinen Code Snippits!
MikeTeeVee
18

Ihr 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
quelle
10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))
Matthew
quelle
-4

Wenn Ihre Zeichenfolge Sonderzeichen enthält, können Sie sie in md5 hashen und dann in eine Guid / Uniqueidentifier konvertieren.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Sven
quelle
8
Dies konvertiert die Eingabezeichenfolge in eine völlig andere GUID
Aaroninus
-6

Die bereitgestellte Guid hat kein korrektes Format (.net Provided Guid).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
user3082965
quelle
6
Wie beantwortet dies die Frage, ob ein Varchar ohne Bindestriche in eine GUID konvertiert werden soll? Dieser Code druckt nur 1.
Aaroninus