Ubah varchar menjadi uniqueidentifier di SQL Server

104

Tabel yang skemanya tidak saya kendalikan, berisi kolom yang didefinisikan sebagai varchar (50) yang menyimpan pengidentifikasi unik dalam format 'a89b1acd95016ae6b9c8aabb07da2010' (tanpa tanda hubung)

Saya ingin mengubahnya menjadi pengidentifikasi unik dalam SQL untuk diteruskan ke .Net Guid. Namun, baris kueri berikut tidak berfungsi untuk saya:

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

dan menghasilkan:

Msg 8169, Tingkat 16, Negara Bagian 2, Baris 1
Konversi gagal saat mengubah dari string karakter menjadi pengidentifikasi unik.

Kueri yang sama menggunakan pengidentifikasi unik bertanda hubung berfungsi dengan baik tetapi datanya tidak disimpan dalam format itu.

Apakah ada cara lain (efisien) untuk mengubah string ini menjadi pengidentifikasi unik di SQL. - Saya tidak ingin melakukannya dalam kode .Net.

granat
sumber
hanya sebaris karakter dan angka bukanlah representasi GUID yang valid - Anda harus menggunakan sihir penguraian string seperti yang ditunjukkan Quassnoi dalam jawabannya.
marc_s

Jawaban:

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
sumber
10
Saya benar-benar berharap ini bukan solusinya tetapi saya kira kita akan segera tahu ...
granat
22
MENYATAKAN @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Ini sudah cukup. Baru mencobanya.
Fabio Milheiro
Oh ya! Maka saya harus setuju. Hal yang jelas adalah meletakkan tanda hubung di tempat yang tepat dan Anda siap untuk pergi! Maaf!
Fabio Milheiro
Menempatkan potongan ini dalam fungsi adalah tambahan yang bagus untuk toolkit Anda, terutama karena beberapa serializer JSON menghapus tanda hubung dari GUID saat membuat serial, sehingga lebih sulit untuk menyalin dan menempel ke SQL untuk di-debug.
David Cumps
27

Itu akan membuat fungsi yang praktis. Juga, perhatikan saya menggunakan STUFF daripada 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
sumber
4
Penggunaan Stuff () dengan sangat baik. Saya hanya perlu mereferensikan bidang saya satu kali dalam pernyataan Select menggunakan metode Anda. Saya menghindari Scalar-Functions, karena mereka tidak selalu cukup "menskalakan" dengan baik, jadi saya menuliskannya. Terima kasih, ini masuk ke Cuplikan Kode saya!
MikeTeeVee
18

varchar col C Anda:

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

Jika string Anda berisi karakter khusus, Anda dapat melakukan hash ke md5 dan kemudian mengubahnya menjadi guid / uniqueidentifier.

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))
Sven
sumber
8
Ini mengubah string input menjadi GUID yang sama sekali berbeda
Aaroninus
-6

Panduan yang diberikan bukanlah format yang benar (.net Provided guid).

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch
pengguna3082965
sumber
6
Bagaimana ini menjawab pertanyaan tentang mengonversi varchar tanpa tanda hubung menjadi GUID? Semua kode ini tidak mencetak 1.
Aaroninus