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?

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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.