SQL Server: UniqueIdentifier'ı bir case deyiminde dizeye dönüştürme


136

Bazen istisna yığın izlemesi olan bir mesaj sütununa sahip bir günlük tablomuz var. Mesajın buna sahip olup olmadığını belirleyen bazı kriterlerim var. Bu mesajları müşteriye göstermek istemiyoruz, bunun yerine şöyle bir mesajımız var:

Dahili Hata Oluştu. Xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx referans koduyla bize ulaşın

burada xxx vb. tablodaki bir kılavuz sütundur. Depolanmış proc yazıyorum:

declare @exceptionCriteria nvarchar(50)
select @exceptionCriteria = '%<enter criteria etc>%'

select LogDate,
       case
       when Message like @exceptionCriteria
       then 'Internal Error Occured. Reference Code: ' + str(RequestID)
       else Message
       end
  from UpdateQueue

RequestIDSQL Server'daki bir Guid veri türüdür ve burada dizeye dönüştürülmez. Bir Guid'in dizeye nasıl dönüştürüleceğine dair bazı kodlar gördüm, ancak çok satırlı ve bir case ifadesinde işe yarayacağını sanmıyorum. Herhangi bir fikir?

Yanıtlar:


257

Sanırım cevabı buldum:

convert(nvarchar(50), RequestID)

İşte bu bilgiyi bulduğum bağlantı:

http://msdn.microsoft.com/en-us/library/ms187928.aspx


21
Alternatif olarak, cast (RequestID as varchar (50))
MK_Dev

3
Cast () ve convert () arasındaki temel fark nedir?
RK Sharma

5
@RKSharma, stackoverflow.com'da sormanız veya birisinin zaten yanıt verip vermediğini görmek için bu sitede arama yapmanız için mükemmel bir soru.
aarona

1
Neden nvarchardaha azını seçeceğimi bilmiyorum nvarchar(50). Bir metin değerine dönüştürüldüğünde benzersiz bir tanımlayıcı, onaltılık çizgi-36 olarak ele alınır.
user2864740

9
Diğer yanıtların da söylediği gibi, bunu yoğunlaştırabilirsiniz cast(RequestID as char(36)).
Frank Tan

90

Burada dönüştürme işlevini kullanmak mümkündür, ancak benzersiz tanımlayıcı değerini tutmak için 36 karakter yeterlidir:

convert(nvarchar(36), requestID) as requestID

2
uzunluk sabit olduğundan burada varchar (36) bile yeterlidir
gdbdable

11
Aynı cümlede "sabit" ve yine de "varchar" diyorsunuz ... peki ya char(36)? Ayrıca kullanabilirsiniz nchar(36), ancak bir GUID unicode içermediği için size hiçbir şey satın almaz. Tersine, ile yapılan işlemler chargenellikle daha hızlıdır varchar.
r2evans

47

Kanımca, uniqueidentifier/ GUID ne a varcharne de a nvarcharama a'dır char(36). Bu nedenle kullanıyorum:

CAST(xyz AS char(36))

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.