SQL Server: konwersja UniqueIdentifier do łańcucha znaków w instrukcji case

145

Mamy tabelę dziennika, która zawiera kolumnę komunikatów, która czasami zawiera ślad stosu wyjątków. Mam pewne kryteria, które określają, czy wiadomość ma to. Nie chcemy pokazywać tych wiadomości klientowi, ale zamiast tego mamy wiadomość taką jak:

Wystąpił błąd wewnętrzny. Skontaktuj się z nami, podając kod referencyjny xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

gdzie xxx itp. to kolumna guid w tabeli. Piszę przechowywane procy w ten sposób:

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

RequestIDjest typem danych Guid w SQL Server i nie jest tutaj konwertowany na ciąg. Widziałem kod pokazujący, jak przekonwertować Guid na ciąg, ale jest on wieloliniowy i nie sądzę, aby zadziałał w instrukcji case. Jakieś pomysły?

aarona
źródło

Odpowiedzi:

271

Myślę, że znalazłem odpowiedź:

convert(nvarchar(50), RequestID)

Oto link, w którym znalazłem te informacje:

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

aarona
źródło
21
Alternatywnie, rzuć (RequestID as varchar (50))
MK_Dev
3
Jaka jest podstawowa różnica między cast () a convert ()?
RK Sharma
5
@RKSharma to idealne pytanie, które możesz zadać na stackoverflow.com lub przeszukać tę witrynę, aby sprawdzić, czy ktoś już na nie odpowiedział.
aarona
1
Nie wiem, dlaczego wybrałem nvarchar, a tym bardziej nvarchar(50). Unikalny identyfikator po przekonwertowaniu na wartość tekstową jest traktowany jako szesnastkowy myślnik-36.
user2864740
10
Jak mówią inne odpowiedzi, możesz to skondensować cast(RequestID as char(36)).
Frank Tan
94

Można tu użyć funkcji konwertującej, ale wystarczy 36 znaków, aby pomieścić wartość unikalnego identyfikatora:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
źródło
2
ponieważ długość jest stała, wystarczy tutaj nawet varchar (36)
gdbdable
11
Mówisz „naprawiono”, a jednak „varchar” w tym samym zdaniu… a co powiesz na to char(36)? Możesz również użyć nchar(36), ale ponieważ identyfikator GUID nie zawiera kodu Unicode, nic Cię nie kupuje. I odwrotnie, operacje w programie charsą zwykle szybsze niż varchar.
r2evans
52

Moim zdaniem uniqueidentifier/ GUID nie jest ani varcharani, nvarcharale char(36). Dlatego używam:

CAST(xyz AS char(36))
Silvan Hofer
źródło
9

Zamiast tego Str(RequestID)spróbujconvert(varchar(38), RequestID)

AussieAtHeart
źródło