Varchar'ı SQL Server'da benzersiz tanımlayıcıya dönüştürme


104

Şema üzerinde denetimim olmayan bir tablo, benzersiz tanımlayıcıları 'a89b1acd95016ae6b9c8aabb07da2010' biçiminde (tire içermeyen) depolayan varchar (50) olarak tanımlanan bir sütun içeriyor

NET Kılavuzuna geçmek için bunları SQL'de benzersiz tanımlayıcılara dönüştürmek istiyorum. Ancak aşağıdaki sorgu satırları benim için çalışmıyor:

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

ve sonuç:

Msg 8169, Düzey 16, Durum 2, Satır 1
Bir karakter dizesinden benzersiz tanımlayıcıya dönüştürülürken dönüştürme başarısız oldu.

Tireli benzersiz tanımlayıcı kullanan aynı sorgular iyi sonuç verir, ancak veriler bu biçimde depolanmaz.

Bu dizeleri SQL'de benzersiz tanımlayıcılara dönüştürmenin başka (verimli) bir yolu var mı? - .Net kodunda yapmak istemiyorum.


sadece bir satır karakter ve sayı gerçekten geçerli bir GUID temsili değildir - Quassnoi'nin cevabında gösterdiği gibi dize ayrıştırma sihrine başvurmanız gerekir.
marc_s

Yanıtlar:


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
Bunun bir çözüm olmayacağını umuyordum ama sanırım yakında öğreneceğiz ...
el bombası

22
DECLARE @u uniqueidentifier SELECT @u = CONVERT (uniqueidentifier, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** Bu yeterli olacaktır. Sadece denedim.
Fabio Milheiro

Oh evet! O zaman kabul etmeliyim. Açık olan şey, kısa çizgileri doğru yerlere koymaktır ve gitmeye hazırsınız! Afedersiniz!
Fabio Milheiro

Bu parçacığı bir işleve yerleştirmek, araç setinize güzel bir ektir, özellikle de bazı JSON serileştiricileri serileştirme sırasında GUID'lerden dashs'leri kaldırarak SQL'e yapıştırarak hata ayıklamayı zorlaştırdığından.
David Cumps

27

Kullanışlı bir işlev olur. Ayrıca, SUBSTRING yerine STUFF kullandığımı unutmayın.

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
Sayfaların mükemmel kullanımı (). Kendi yönteminizi kullanarak bir Select ifadesinde alanıma yalnızca bir kez başvurmam gerekiyor. Yine de Skaler-Fonksiyonlardan kaçınıyorum, çünkü her zaman tam olarak "ölçeklenmiyorlar", bu yüzden yazıyorum. Teşekkürler, bu Kod Parçacıklarıma giriyor!
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

Dizeniz özel karakterler içeriyorsa, onu md5'e hash edebilir ve ardından onu bir kılavuz / benzersiz tanımlayıcıya dönüştürebilirsiniz.

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

8
Bu, giriş dizesini tamamen farklı bir
GUID'ye

-6

Sağlanan kılavuz doğru formatta değil (.net Sağlanan kılavuz).

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

6
Bu, varchar'ı tire olmadan GUID'ye dönüştürme sorusunu nasıl yanıtlar? Bu kodun yaptığı tek şey 1. yazdırmaktır.
Aaroninus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.