SQL Server: Konvertieren von UniqueIdentifier in eine Zeichenfolge in einer case-Anweisung

136

Wir haben eine Protokolltabelle mit einer Nachrichtenspalte, die manchmal einen Ausnahmestapel-Trace enthält. Ich habe einige Kriterien, die bestimmen, ob die Nachricht dies hat. Wir möchten diese Nachrichten nicht dem Kunden zeigen, sondern haben eine Nachricht wie:

Interner Fehler aufgetreten. Kontaktieren Sie uns mit dem Referenzcode xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Dabei ist xxx usw. eine Guid-Spalte in der Tabelle. Ich schreibe gespeicherten Prozess wie folgt:

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

RequestIDist ein Guid-Datentyp in SQL Server und wird hier nicht in Zeichenfolgen konvertiert. Ich habe Code zum Konvertieren eines Guid in einen String gesehen, aber er ist mehrzeilig und ich glaube nicht, dass er in einer case-Anweisung funktionieren würde. Irgendwelche Ideen?

aarona
quelle

Antworten:

256

Ich glaube, ich habe die Antwort gefunden:

convert(nvarchar(50), RequestID)

Hier ist der Link, über den ich diese Informationen gefunden habe:

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

aarona
quelle
21
Alternativ können Sie (RequestID als varchar (50))
MK_Dev
3
Was ist der grundlegende Unterschied zwischen cast () und convert ()?
RK Sharma
5
@RKSharma, das ist eine perfekte Frage, die Sie auf stackoverflow.com stellen oder auf dieser Website suchen können, um festzustellen, ob jemand sie bereits beantwortet hat.
Arona
1
Ich weiß nicht , warum ich wählen würde nvarchar, viel weniger nvarchar(50). Eine eindeutige Kennung wird bei der Konvertierung in einen Textwert in hex-dash-36 behandelt.
user2864740
9
Wie andere Antworten sagen, können Sie dies verdichten cast(RequestID as char(36)).
Frank Tan
90

Es ist möglich, die Konvertierungsfunktion hier zu verwenden, aber 36 Zeichen reichen aus, um den eindeutigen Bezeichnerwert zu speichern:

convert(nvarchar(36), requestID) as requestID
Philippe Grondier
quelle
2
weil die Länge festgelegt ist, reicht hier sogar varchar (36) aus
gdbdable
11
Du sagst "fest" und doch "varchar" im selben Satz ... wie wäre es char(36)? Sie können auch verwenden nchar(36), aber da eine GUID keinen Unicode enthält, kauft sie Ihnen nichts. Umgekehrt sind Operationen mit charim Allgemeinen schneller als varchar.
R2evans
47

Meiner Meinung nach ist uniqueidentifier/ GUID weder ein varcharnoch ein nvarcharaber ein char(36). Deshalb benutze ich:

CAST(xyz AS char(36))
Silvan Hofer
quelle
8

Str(RequestID)Versuchen Sie es stattdessenconvert(varchar(38), RequestID)

AussieAtHeart
quelle