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.


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)

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

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))

10
SELECT CONVERT(uniqueidentifier,STUFF(STUFF(STUFF(STUFF('B33D42A3AC5A4D4C81DD72F3D5C49025',9,0,'-'),14,0,'-'),19,0,'-'),24,0,'-'))

-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'))

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

6
Bagaimana ini menjawab pertanyaan tentang mengonversi varchar tanpa tanda hubung menjadi GUID? Semua kode ini tidak mencetak 1.
Aaroninus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.